﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОписаниеПеременных

Перем КлючТекущегоВарианта; // Строка
                            // Хранит идентификатор настроек варианта отчета.
                            // Также см. Синтакс-помощник.
Перем КлючРодительскогоВарианта; // Строка
Перем СвойстваРегистров; // см. НовыеСвойстваРегистров
Перем Примечания; // см. ПалитраСвойствПримечаний

#КонецОбласти

#Область ПрограммныйИнтерфейс

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.ВариантыОтчетов

// Задать настройки формы отчета.
//
// Параметры:
//   Форма - ФормаКлиентскогоПриложения
//         - Неопределено
//   КлючВарианта - Строка
//                - Неопределено
//   Настройки - см. ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию
//
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
	
	Настройки.ПараметрыРасположенияЭлементовУправления = ПараметрыРасположенияЭлементовУправления();
	
	Настройки.События.ПриСозданииНаСервере               = Истина;
	Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;
	Настройки.События.ПередЗагрузкойВариантаНаСервере    = Истина;
	Настройки.События.ПриОпределенииПараметровВыбора     = Истина;
	
	Настройки.ФормироватьСразу = Истина;
	
КонецПроцедуры

// Вызывается перед загрузкой новых настроек. Используется для изменения СКД отчета.
//
// Параметры:
//   Контекст - Произвольный
//   КлючСхемы - Строка
//   КлючВарианта - Строка
//                - Неопределено
//   НовыеНастройкиКД - НастройкиКомпоновкиДанных
//                    - Неопределено
//   НовыеПользовательскиеНастройкиКД - ПользовательскиеНастройкиКомпоновкиДанных
//                                    - Неопределено
//
Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
	
	КлючТекущегоВарианта = КлючВарианта;
	
	Если ТипЗнч(НовыеНастройкиКД) <> Тип("НастройкиКомпоновкиДанных") Тогда
		НовыеНастройкиКД = КомпоновщикНастроек.Настройки;
	КонецЕсли;
	
	Если ТипЗнч(НовыеПользовательскиеНастройкиКД) <> Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда
		НовыеПользовательскиеНастройкиКД = КомпоновщикНастроек.ПользовательскиеНастройки;
	КонецЕсли;
	
	ПараметрыОтчета = ПараметрыОтчета(НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД);
	
	Если ПараметрыОтчета.ДокументВладелец = Неопределено Тогда
		ВызватьИсключение НСтр("ru = 'Отчет о движениях документа возможно открыть из формы документа.'");
	КонецЕсли;
	
	КлючРодительскогоВарианта = КлючРодительскогоВарианта(Контекст, КлючВарианта, НовыеНастройкиКД);
	
	Если КлючСхемы = КлючВарианта Тогда
		Возврат;
	КонецЕсли;
	
	КлючСхемы = КлючВарианта;
	
	ПолучитьСвойстваРегистров(Контекст, ПараметрыОтчета.ДокументВладелец);
	
	ДобавитьРесурсРасчетаКоличестваЗаписей(СхемаКомпоновкиДанных);
	
	СписокРегистров = СписокРегистров();
	СписокВыбранныхРегистров = СписокВыбранныхРегистров(СписокРегистров, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД);
	
	НайденныйПараметр = СхемаКомпоновкиДанных.Параметры.Найти("СписокРегистров");
	НайденныйПараметр.УстановитьДоступныеЗначения(СписокРегистров);
	
	ЗначенияПараметров = Новый Структура;
	ЗначенияПараметров.Вставить("ДокументВладелец", ПараметрыОтчета.ДокументВладелец);
	ЗначенияПараметров.Вставить("СписокРегистров", СписокВыбранныхРегистров);
	
	ОграничитьТипВладельца(ПараметрыОтчета.ДокументВладелец);
	УстановитьПараметрыДанных(НовыеНастройкиКД, ЗначенияПараметров, НовыеПользовательскиеНастройкиКД);
	
	ЭтоПредопределенныйВариант = (КлючРодительскогоВарианта = КлючВарианта);
	
	Если КлючРодительскогоВарианта = "Основной" Тогда
		ПодготовитьГоризонтальныйВариант(ПараметрыОтчета.ДокументВладелец, НовыеНастройкиКД, ЭтоПредопределенныйВариант);
	ИначеЕсли КлючРодительскогоВарианта = "Дополнительный" Тогда
		ПодготовитьВертикальныйВариант(ПараметрыОтчета.ДокументВладелец, НовыеНастройкиКД, ЭтоПредопределенныйВариант);
	КонецЕсли;
	
	ДополнительныеСвойства = НовыеНастройкиКД.ДополнительныеСвойства;
	ДополнительныеСвойства.Вставить("ИдентификаторыСвойствНастроек", Новый Массив);
	ДополнительныеСвойства.Вставить("КлючРодительскогоВарианта", КлючРодительскогоВарианта);
	
	ОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Контекст, СхемаКомпоновкиДанных, КлючСхемы);
	
	УстановитьУсловноеОформление(НовыеНастройкиКД);
	ОпределитьИспользуемыеТаблицы(Контекст);
	
КонецПроцедуры

// См. ОтчетыПереопределяемый.ПриСозданииНаСервере.
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
	
	Если Форма.Параметры.ПредставлениеВарианта = "Расшифровка" Тогда
		ВызватьИсключение НСтр("ru = 'Выбранное действие в данном отчете не доступно.'");
	КонецЕсли;
	
	ДокументВладелец = Неопределено;
	
	Если Не Форма.Параметры.Свойство("ДокументВладелец", ДокументВладелец)
		И Не Форма.Параметры.Свойство("ПараметрКоманды", ДокументВладелец)
		И Не ЗначениеЗаполнено(ДокументВладелец) Тогда 
		
		Возврат;
	КонецЕсли;
	
	СтруктураПараметровДанных = Новый Структура("ДокументВладелец", ДокументВладелец);
	УстановитьПараметрыДанных(КомпоновщикНастроек.Настройки, СтруктураПараметровДанных);
	
КонецПроцедуры

// См. ОтчетыПереопределяемый.ПриОпределенииПараметровВыбора.
Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт
	
	Если СвойстваРегистров = Неопределено
		Или СвойстваРегистров.Количество() = 0
		Или СвойстваНастройки.ПолеКД <> Новый ПолеКомпоновкиДанных("ПараметрыДанных.СписокРегистров") Тогда
		Возврат;
	КонецЕсли;
	
	СвойстваНастройки.ОграничиватьВыборУказаннымиЗначениями = Истина;
	СвойстваНастройки.ЗначенияДляВыбора = СписокРегистров();
	
КонецПроцедуры

// См. ОтчетыПереопределяемый.ПередЗагрузкойВариантаНаСервере.
Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт
	
	НайденныйПараметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ДокументВладелец");
	Если НайденныйПараметр = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ДокументВладелец = НайденныйПараметр.Значение;
	Если Не ЗначениеЗаполнено(ДокументВладелец) Тогда 
		Возврат;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Форма.КонтекстВарианта) Тогда 
		НовыеНастройкиКД.ДополнительныеСвойства.Вставить("ИсходныйДокументВладелец", ДокументВладелец);
	КонецЕсли;
	
	УстановитьПараметрыДанных(НовыеНастройкиКД, Новый Структура("ДокументВладелец", ДокументВладелец));
	
КонецПроцедуры

// Конец СтандартныеПодсистемы.ВариантыОтчетов

#КонецОбласти

#КонецОбласти

#Область ОбработчикиСобытий

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	НайденныйПараметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ДокументВладелец");
	Если НайденныйПараметр = Неопределено
		Или Не ЗначениеЗаполнено(НайденныйПараметр.Значение) Тогда
		Возврат;
	КонецЕсли;
	
	ДокументВладелец = НайденныйПараметр.Значение;
	
	МакетЗаголовка                              = ПолучитьМакет("Заголовок");
	ОбластьЗаголовка                            = МакетЗаголовка.ПолучитьОбласть("ОбластьЗаголовок");
	ОбластьЗаголовка.Параметры.СсылкаНаДокумент = Строка(ДокументВладелец);
	ПустаяОбласть                               = МакетЗаголовка.ПолучитьОбласть("ПустаяОбласть");
	
	ОбластьЗаголовка.ТекущаяОбласть.Расшифровка = ДокументВладелец;
	
	ДокументРезультат.Вывести(ПустаяОбласть);
	ДокументРезультат.Вывести(ОбластьЗаголовка);
	ДокументРезультат.Вывести(ПустаяОбласть);
	
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	
	ПолучитьСвойстваРегистров(Настройки, ДокументВладелец);
	
	НайденныйПараметр = Настройки.ПараметрыДанных.Элементы.Найти("СписокРегистров");
	Если НайденныйПараметр <> Неопределено
		И Не НайденныйПараметр.Использование Тогда 
		
		НайденныйПараметр.Использование = Истина;
		НайденныйПараметр.Значение = СписокРегистров();
		
	КонецЕсли;
	
	ВосстановитьОтборПоГруппировкамРегистров(Настройки);
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки   = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
	ОформитьРезультат(Настройки, ДокументРезультат, ДокументВладелец);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область ПрограммноеФормированиеСКД

#Область ПодготовкаДанных

Процедура ОграничитьТипВладельца(Владелец)
	
	ТипыВладельца = Новый Массив;
	ТипыВладельца.Добавить(ТипЗнч(Владелец));
	
	НайденныйПараметр = СхемаКомпоновкиДанных.Параметры.Найти("ДокументВладелец");
	НайденныйПараметр.ТипЗначения = Новый ОписаниеТипов(ТипыВладельца);
	
КонецПроцедуры

Функция НаборыДанныхОтчета(ДокументВладелец, ДополнительнаяНумерация = Ложь)
	
	НаборыДанных = Новый Массив;
	
	Для Каждого СвойстваРегистра Из СвойстваРегистров Цикл
		
		НаборДанных = Неопределено;
		МетаданныеРегистра = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(СвойстваРегистра.ПолноеИмяРегистра);
		
		Если СвойстваРегистра.ВидРегистра = "РегистрНакопления"
			Или СвойстваРегистра.ВидРегистра = "РегистрСведений" Тогда
			
			НаборДанных = НаборДанныхДляРегистраНакопленияСведений(СвойстваРегистра, МетаданныеРегистра, ДополнительнаяНумерация);
			
		ИначеЕсли СвойстваРегистра.ВидРегистра = "РегистрБухгалтерии" Тогда
			
			НаборДанных = НаборДанныхДляРегистраБухгалтерии(СвойстваРегистра, МетаданныеРегистра);
			
		ИначеЕсли СвойстваРегистра.ВидРегистра = "РегистрРасчета" Тогда
			
			НаборДанных = НаборДанныхДляРегистраРасчета(СвойстваРегистра, МетаданныеРегистра, ДополнительнаяНумерация);
			
		КонецЕсли;
		
		Если НаборДанных <> Неопределено Тогда
			НаборыДанных.Добавить(НаборДанных);
		КонецЕсли;
		
	КонецЦикла;
	
	ОтчетОДвиженияхДокументаПереопределяемый.ПриПодготовкеНабораДанных(ДокументВладелец, НаборыДанных);
	
	Возврат НаборыДанных;
	
КонецФункции

Функция НаборДанныхДляРегистраНакопленияСведений(СвойстваРегистра, МетаданныеРегистра, ДополнительнаяНумерация)
	
	НаборДанных = Новый Структура;
	НаборДанных.Вставить("Измерения",              Новый Структура);
	НаборДанных.Вставить("Ресурсы",                Новый Структура);
	НаборДанных.Вставить("Реквизиты",              Новый Структура);
	НаборДанных.Вставить("СтандартныеРеквизиты",   Новый Структура);
	НаборДанных.Вставить("ПолноеИмяРегистра",      СвойстваРегистра.ИмяГруппировки);
	НаборДанных.Вставить("ИмяРегистра",            СвойстваРегистра.ИмяРегистра);
	НаборДанных.Вставить("ВидРегистра",            СвойстваРегистра.ВидРегистра);
	НаборДанных.Вставить("ПредставлениеВидаРегистра", СвойстваРегистра.ПредставлениеВидаРегистра);
	НаборДанных.Вставить("ПредставлениеРегистра",  СвойстваРегистра.ПредставлениеРегистра);
	
	Если ДополнительнаяНумерация Тогда
		НаборДанных.Вставить("Нумератор", Новый Структура);
	КонецЕсли;
	
	РеквизитыИсключения = ОбщегоНазначенияКлиентСервер.МассивЗначений("НомерСтроки", "Регистратор");
	НаборДанных.СтандартныеРеквизиты = ИменаПредставленияПолей(МетаданныеРегистра.СтандартныеРеквизиты, РеквизитыИсключения);
	НаборДанных.Измерения            = ИменаПредставленияПолей(МетаданныеРегистра.Измерения);
	НаборДанных.Ресурсы              = ИменаПредставленияПолей(МетаданныеРегистра.Ресурсы);
	НаборДанных.Реквизиты            = ИменаПредставленияПолей(МетаданныеРегистра.Реквизиты);
	
	ПоляВыбора = Новый Массив;
	ДобавитьПоля(ПоляВыбора, НаборДанных.СтандартныеРеквизиты, МетаданныеРегистра);
	ДобавитьПоля(ПоляВыбора, НаборДанных.Измерения, МетаданныеРегистра, "Измерения");
	ДобавитьПоля(ПоляВыбора, НаборДанных.Ресурсы, МетаданныеРегистра, "Ресурсы");
	ДобавитьПоля(ПоляВыбора, НаборДанных.Реквизиты, МетаданныеРегистра, "Реквизиты");
	
	Если ДополнительнаяНумерация Тогда
		НаборДанных.Нумератор = НомераПолей(НаборДанных);
		ДобавитьНомераПолей(ПоляВыбора, НаборДанных.Нумератор);
	КонецЕсли;
	
	ТекстЗапроса =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	1 КАК КоличествоЗаписейРегистра,
	|	""&ИмяРегистра"" КАК ИмяРегистра,
	|	&Поля
	|ИЗ
	|	&ТекущаяТаблица КАК ТекущаяТаблица
	|ГДЕ
	|	&ИмяПоляРегистратора = &ДокументВладелец
	|{ГДЕ
	|	""&ИмяГруппировки"" В (&СписокРегистров)}";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРегистра", СвойстваРегистра.ИмяГруппировки);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Поля", СтрСоединить(ПоляВыбора, "," + Символы.ПС + Символы.Таб));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекущаяТаблица", СвойстваРегистра.ПолноеИмяРегистра);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляРегистратора", СвойстваРегистра.ИмяПоляРегистратора);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяГруппировки", СвойстваРегистра.ИмяГруппировки);
	
	НаборДанных.Вставить("ТекстЗапроса", ТекстЗапроса);
	
	Возврат НаборДанных;
	
КонецФункции

Функция НаборДанныхДляРегистраБухгалтерии(СвойстваРегистра, МетаданныеРегистра)
	
	НаборДанных = Новый Структура;
	НаборДанных.Вставить("СтандартныеРеквизиты",   Новый Структура);
	НаборДанных.Вставить("Измерения",              Новый Структура);
	НаборДанных.Вставить("Ресурсы",                Новый Структура);
	НаборДанных.Вставить("РесурсыДт",              Новый Структура);
	НаборДанных.Вставить("РесурсыКт",              Новый Структура);
	НаборДанных.Вставить("Субконто",               Новый Структура);
	НаборДанных.Вставить("СубконтоДт",             Новый Структура);
	НаборДанных.Вставить("СубконтоКт",             Новый Структура);
	НаборДанных.Вставить("ИзмеренияДт",            Новый Структура);
	НаборДанных.Вставить("ИзмеренияКт",            Новый Структура);
	НаборДанных.Вставить("Реквизиты",              Новый Структура);
	НаборДанных.Вставить("ПолноеИмяРегистра",      СвойстваРегистра.ИмяГруппировки);
	НаборДанных.Вставить("ИмяРегистра",            СвойстваРегистра.ИмяРегистра);
	НаборДанных.Вставить("ВидРегистра",            СвойстваРегистра.ВидРегистра);
	НаборДанных.Вставить("ПредставлениеВидаРегистра", СвойстваРегистра.ПредставлениеВидаРегистра);
	НаборДанных.Вставить("ПредставлениеРегистра",  СвойстваРегистра.ПредставлениеРегистра);
	
	МаксимальноеКоличествоСубконто = МетаданныеРегистра.ПланСчетов.МаксКоличествоСубконто;
	
	ПредставлениеДебет    = НСтр("ru = 'Дт'");
	ПредставлениеКредит   = НСтр("ru = 'Кт'");
	ПредставлениеСубконто = НСтр("ru = 'Субконто'");
	ПредставлениеСчет     = НСтр("ru = 'Счет'");
	
	РеквизитыИсключения = ОбщегоНазначенияКлиентСервер.МассивЗначений(
		"НомерСтроки", "Регистратор", "Счет");
	Для ИндексСубконто = 1 По МаксимальноеКоличествоСубконто Цикл
		ИндексСубконтоСтрокой =  Формат(ИндексСубконто, "ЧГ=0");
		РеквизитыИсключения.Добавить("ВидСубконто" + ИндексСубконтоСтрокой);
		РеквизитыИсключения.Добавить("Субконто" + ИндексСубконтоСтрокой);
	КонецЦикла;
	НаборДанных.СтандартныеРеквизиты = ИменаПредставленияПолей(МетаданныеРегистра.СтандартныеРеквизиты, РеквизитыИсключения);
	НаборДанных.Реквизиты            = ИменаПредставленияПолей(МетаданныеРегистра.Реквизиты, РеквизитыИсключения);
	
	Для Каждого Ресурс Из МетаданныеРегистра.Ресурсы Цикл
	
		Если Ресурс.Балансовый Или Не МетаданныеРегистра.Корреспонденция Тогда
			НаборДанных.Ресурсы.Вставить(Ресурс.Имя, Ресурс.Представление());
		Иначе
			НаборДанных.РесурсыДт.Вставить(Ресурс.Имя + "Дт", Ресурс.Представление() + " " + ПредставлениеДебет);
			НаборДанных.РесурсыКт.Вставить(Ресурс.Имя + "Кт", Ресурс.Представление() + " " + ПредставлениеКредит);
		КонецЕсли;
	
	КонецЦикла;
	
	Для ИндексСубконто = 1 По МаксимальноеКоличествоСубконто Цикл
	    ИндексСтрокой = Формат(ИндексСубконто, "ЧГ=0");
		Если МетаданныеРегистра.Корреспонденция Тогда
			НаборДанных.СубконтоДт.Вставить("СубконтоДт" + ИндексСтрокой,
				ПредставлениеСубконто + " " + ПредставлениеДебет + " " + ИндексСтрокой);
			НаборДанных.СубконтоКт.Вставить("СубконтоКт" + ИндексСтрокой,
				ПредставлениеСубконто + " " + ПредставлениеКредит + " " + ИндексСтрокой);
		Иначе
			НаборДанных.Субконто.Вставить("Субконто" + ИндексСтрокой, ПредставлениеСубконто + " " + ИндексСтрокой);
		КонецЕсли;
		
	КонецЦикла;
	
	Если МетаданныеРегистра.Корреспонденция Тогда
		НаборДанных.ИзмеренияДт.Вставить("СчетДт", ПредставлениеСчет + " " + ПредставлениеДебет);
		НаборДанных.ИзмеренияКт.Вставить("СчетКт", ПредставлениеСчет + " " + ПредставлениеКредит);
	Иначе
		НаборДанных.ИзмеренияДт.Вставить("Счет", ПредставлениеСчет);
	КонецЕсли;
	
	Измерения = МетаданныеРегистра.Измерения;
	Для Каждого Измерение Из Измерения Цикл
	
		Если Измерение.Балансовый Или Не МетаданныеРегистра.Корреспонденция Тогда
			НаборДанных.Измерения.Вставить(Измерение.Имя, Измерение.Представление());
		Иначе
			НаборДанных.ИзмеренияДт.Вставить(Измерение.Имя + "Дт", Измерение.Представление() + " " + ПредставлениеДебет);
			НаборДанных.ИзмеренияКт.Вставить(Измерение.Имя + "Кт", Измерение.Представление() + " " + ПредставлениеКредит);
		КонецЕсли;
	
	КонецЦикла;
	
	ПоляВыбора = Новый Массив;
	ДобавитьПоля(ПоляВыбора, НаборДанных.СтандартныеРеквизиты, МетаданныеРегистра);
	ДобавитьПоля(ПоляВыбора, НаборДанных.Реквизиты, МетаданныеРегистра, "Реквизиты");
	ДобавитьПоля(ПоляВыбора, НаборДанных.Измерения, МетаданныеРегистра, "Измерения");
	ДобавитьПоля(ПоляВыбора, НаборДанных.ИзмеренияДт, МетаданныеРегистра);
	ДобавитьПоля(ПоляВыбора, НаборДанных.ИзмеренияКт, МетаданныеРегистра);
	ДобавитьПоля(ПоляВыбора, НаборДанных.Ресурсы, МетаданныеРегистра, "Ресурсы");
	ДобавитьПоля(ПоляВыбора, НаборДанных.РесурсыДт, МетаданныеРегистра);
	ДобавитьПоля(ПоляВыбора, НаборДанных.РесурсыКт, МетаданныеРегистра);
	Если НЕ МетаданныеРегистра.Корреспонденция Тогда  	
		ДобавитьПоля(ПоляВыбора, НаборДанных.Субконто, МетаданныеРегистра);
	КонецЕсли;
	ДобавитьПоля(ПоляВыбора, НаборДанных.СубконтоДт, МетаданныеРегистра);
	ДобавитьПоля(ПоляВыбора, НаборДанных.СубконтоКт, МетаданныеРегистра);
	
	ТекстЗапроса =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	1 КАК КоличествоЗаписейРегистра,
	|	""&ИмяРегистра"" КАК ИмяРегистра,
	|	&Поля
	|ИЗ
	|	&ТекущаяТаблица КАК ТекущаяТаблица
	|ГДЕ
	|	&ИмяПоляРегистратора = &ДокументВладелец
	|{ГДЕ
	|	(""&ИмяГруппировки"" В (&СписокРегистров))}";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРегистра", СвойстваРегистра.ИмяГруппировки);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Поля", СтрСоединить(ПоляВыбора, "," + Символы.ПС + Символы.Таб));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекущаяТаблица", 
		СтрШаблон("РегистрБухгалтерии.%1.ДвиженияССубконто(, , %2 = &ДокументВладелец)", 
			СвойстваРегистра.ИмяРегистра, СвойстваРегистра.ИмяПоляРегистратора));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляРегистратора", СвойстваРегистра.ИмяПоляРегистратора);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяГруппировки", СвойстваРегистра.ИмяГруппировки);
	
	НаборДанных.Вставить("ТекстЗапроса", ТекстЗапроса);
	
	Возврат НаборДанных;
	
КонецФункции

Функция НаборДанныхДляРегистраРасчета(СвойстваРегистра, МетаданныеРегистра, ДополнительнаяНумерация)
	
	НаборДанных = Новый Структура;
	НаборДанных.Вставить("Измерения",              Новый Структура);
	НаборДанных.Вставить("Ресурсы",                Новый Структура);
	НаборДанных.Вставить("Реквизиты",              Новый Структура);
	НаборДанных.Вставить("СтандартныеРеквизиты",   Новый Структура);
	НаборДанных.Вставить("ПолноеИмяРегистра",      СвойстваРегистра.ИмяГруппировки);
	НаборДанных.Вставить("ИмяРегистра",            СвойстваРегистра.ИмяРегистра);
	НаборДанных.Вставить("ВидРегистра",            СвойстваРегистра.ВидРегистра);
	НаборДанных.Вставить("ПредставлениеВидаРегистра", СвойстваРегистра.ПредставлениеВидаРегистра);
	НаборДанных.Вставить("ПредставлениеРегистра",  СвойстваРегистра.ПредставлениеРегистра);
	
	Если ДополнительнаяНумерация Тогда
		НаборДанных.Вставить("Нумератор", Новый Структура);
	КонецЕсли;
	
	Для Каждого Реквизит Из МетаданныеРегистра.СтандартныеРеквизиты Цикл
		НаборДанных.СтандартныеРеквизиты.Вставить(Реквизит.Имя, Реквизит.Представление());
	КонецЦикла;
	
	НаборДанных.Измерения = ИменаПредставленияПолей(МетаданныеРегистра.Измерения);
	НаборДанных.Ресурсы   = ИменаПредставленияПолей(МетаданныеРегистра.Ресурсы);
	НаборДанных.Реквизиты = ИменаПредставленияПолей(МетаданныеРегистра.Реквизиты);
	
	ПоляВыбора = Новый Массив;
	ДобавитьПоля(ПоляВыбора, НаборДанных.СтандартныеРеквизиты, МетаданныеРегистра);
	ДобавитьПоля(ПоляВыбора, НаборДанных.Измерения, МетаданныеРегистра, "Измерения");
	ДобавитьПоля(ПоляВыбора, НаборДанных.Ресурсы, МетаданныеРегистра, "Ресурсы");
	ДобавитьПоля(ПоляВыбора, НаборДанных.Реквизиты, МетаданныеРегистра, "Реквизиты");
	
	Если ДополнительнаяНумерация Тогда
		НаборДанных.Нумератор = НомераПолей(НаборДанных);
		ДобавитьНомераПолей(ПоляВыбора, НаборДанных.Нумератор);
	КонецЕсли;
	
	ТекстЗапроса =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	1 КАК КоличествоЗаписейРегистра,
	|	""&ИмяРегистра"" КАК ИмяРегистра,
	|	&Поля
	|ИЗ
	|	&ТекущаяТаблица КАК ТекущаяТаблица
	|ГДЕ
	|	&ИмяПоляРегистратора = &ДокументВладелец
	|{ГДЕ
	|	""&ИмяГруппировки"" В (&СписокРегистров)}";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРегистра", СвойстваРегистра.ИмяГруппировки);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Поля", СтрСоединить(ПоляВыбора, "," + Символы.ПС + Символы.Таб));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекущаяТаблица", СвойстваРегистра.ПолноеИмяРегистра);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляРегистратора", СвойстваРегистра.ИмяПоляРегистратора);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяГруппировки", СвойстваРегистра.ИмяГруппировки);
	
	НаборДанных.Вставить("ТекстЗапроса", ТекстЗапроса);
	
	Возврат НаборДанных;
	
КонецФункции

Процедура ДобавитьНомераПолей(СписокПолей, Нумераторы)
	
	Для Каждого Нумератор Из Нумераторы Цикл
		СписокПолей.Добавить(Нумератор.Значение + " КАК " + Нумератор.Ключ); // @query-part
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#Область ГоризонтальныйВариант

Процедура ПодготовитьГоризонтальныйВариант(ДокументВладелец, Настройки, ЭтоПредопределенныйВариант)
	
	Если СвойстваРегистров.Количество() = 0 Тогда 
		Возврат;
	КонецЕсли;
	
	НаборыДанных = НаборыДанныхОтчета(ДокументВладелец);
	
	ОсновнойНаборДанных = СхемаКомпоновкиДанных.НаборыДанных["Main"]; // НаборДанныхОбъединениеСхемыКомпоновкиДанных
	ЭлементыНаборовДанных = ОсновнойНаборДанных.Элементы;
	
	ИндексНабора = 0;
	Для Каждого НаборДанных Из НаборыДанных Цикл
	
		ИндексНабора = ИндексНабора + 1;
		ИмяНабора = "ЗапросПо" + НаборДанных.ПолноеИмяРегистра;
		ЭлементНабораДанных = ЭлементыНаборовДанных.Найти(ИмяНабора);
	
		Если ЭлементНабораДанных = Неопределено Тогда
	
			ЭлементНабораДанных = ЭлементыНаборовДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
			ЭлементНабораДанных.Имя = ИмяНабора;
			ЭлементНабораДанных.ИсточникДанных = "ИсточникДанных1";
			ЭлементНабораДанных.Запрос = НаборДанных.ТекстЗапроса;
	
			ДоопределитьМакетСКД(СхемаКомпоновкиДанных, ИндексНабора, НаборДанных.ВидРегистра,
				НаборДанных.ПредставлениеВидаРегистра, НаборДанных.ИмяРегистра);
	
		КонецЕсли;
		
		Если ЭтоПредопределенныйВариант Тогда 
			ПодготовитьГоризонтальныйВариантНабораДанных(Настройки, НаборДанных, ЭлементНабораДанных);
		КонецЕсли;
		
	КонецЦикла;
	
	СкрытьПараметрыИОтборы(Настройки);
	
КонецПроцедуры

Процедура ПодготовитьГоризонтальныйВариантНабораДанных(НастройкиКД, ЭлементДанных, НаборДанныхКД)
	
	Если ЭлементДанных.ВидРегистра = "РегистрНакопления" Или ЭлементДанных.ВидРегистра = "РегистрСведений" Тогда
		
		ПодготовитьГоризонтальныйВариантРегистровНакопленияИСведений(НастройкиКД, НаборДанныхКД, ЭлементДанных);
		
	ИначеЕсли ЭлементДанных.ВидРегистра = "РегистрБухгалтерии" Тогда
		
		ПодготовитьГоризонтальныйВариантРегистровБухгалтерии(НастройкиКД, НаборДанныхКД, ЭлементДанных);
		
	ИначеЕсли ЭлементДанных.ВидРегистра = "РегистрРасчета" Тогда
		
		ПодготовитьГоризонтальныйВариантРегистровРасчета(НастройкиКД, НаборДанныхКД, ЭлементДанных);
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ПодготовитьГоризонтальныйВариантРегистровНакопленияИСведений(НастройкиКД, НаборДанныхКД, ЭлементДанных)
	
	ВидРегистра            = ЭлементДанных.ВидРегистра;
	ПредставлениеВидаРегистра = ЭлементДанных.ПредставлениеВидаРегистра;
	ИмяРегистра            = ЭлементДанных.ИмяРегистра;
	ПредставлениеРегистра  = ЭлементДанных.ПредставлениеРегистра;
	
	СтруктураСтандартныхРеквизитов = ЭлементДанных.СтандартныеРеквизиты;
	СтруктураИзмерений             = ЭлементДанных.Измерения;
	СтруктураРесурсов              = ЭлементДанных.Ресурсы;
	СтруктураРеквизитов            = ЭлементДанных.Реквизиты;
	
	ПользовательскийЗаголовок = ПредставлениеВидаРегистра + " " + ПредставлениеРегистра;
	ГруппировкаДетальныеЗаписи = ДетальныеЗаписиПоРегистру(НастройкиКД, ВидРегистра + "_" + ИмяРегистра, ПользовательскийЗаголовок);
	
	Если СтруктураСтандартныхРеквизитов.Количество() > 0 Тогда
		
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "СтандартныеРеквизиты");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  Неопределено);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", НСтр("ru = 'Стандартные реквизиты'"));
		
		РазместитьГруппуПолейСКД(СтруктураСтандартныхРеквизитов, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураИзмерений.Количество() > 0 Тогда
		
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Измерения");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  Неопределено);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", НСтр("ru = 'Измерения'"));
		
		РазместитьГруппуПолейСКД(СтруктураИзмерений, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураРесурсов.Количество() > 0 Тогда
		
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Ресурсы");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  Неопределено);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", НСтр("ru = 'Ресурсы'"));
		
		РазместитьГруппуПолейСКД(СтруктураРесурсов, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураРеквизитов.Количество() > 0 Тогда
		
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Реквизиты");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  Неопределено);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", НСтр("ru = 'Реквизиты'"));
		
		РазместитьГруппуПолейСКД(СтруктураРеквизитов, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;

КонецПроцедуры

Процедура ПодготовитьГоризонтальныйВариантРегистровРасчета(НастройкиКД, НаборДанныхКД, ЭлементДанных)
	
	ВидРегистра            = "РегистрРасчета";
	ИмяРегистра            = ЭлементДанных.ИмяРегистра;
	ПредставлениеРегистра  = ЭлементДанных.ПредставлениеРегистра;
	
	СтруктураСтандартныхРеквизитов = ЭлементДанных.СтандартныеРеквизиты;
	СтруктураИзмерений             = ЭлементДанных.Измерения;
	СтруктураРесурсов              = ЭлементДанных.Ресурсы;
	СтруктураРеквизитов            = ЭлементДанных.Реквизиты;
	
	ПользовательскийЗаголовок = НСтр("ru = 'Регистр расчета'") + " " + ПредставлениеРегистра;
	
	ГруппировкаДетальныеЗаписи = ДетальныеЗаписиПоРегистру(НастройкиКД,
		ВидРегистра + "_" + ИмяРегистра, ПользовательскийЗаголовок);
	
	Если СтруктураСтандартныхРеквизитов.Количество() > 0 Тогда
		
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "СтандартныеРеквизиты");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Горизонтально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", "");
		
		РазместитьГруппуПолейСКД(СтруктураСтандартныхРеквизитов, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураИзмерений.Количество() > 0 Тогда
		
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Измерения");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  Неопределено);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", НСтр("ru = 'Измерения'"));
		
		РазместитьГруппуПолейСКД(СтруктураИзмерений, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
		
	КонецЕсли;
	
	Если СтруктураРесурсов.Количество() > 0 Тогда
		
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Ресурсы");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  Неопределено);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", НСтр("ru = 'Ресурсы'"));
		
		РазместитьГруппуПолейСКД(СтруктураРесурсов, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
		
	КонецЕсли;
	
	Если СтруктураРеквизитов.Количество() > 0 Тогда
		
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Реквизиты");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  Неопределено);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", НСтр("ru = 'Реквизиты'"));
		
		РазместитьГруппуПолейСКД(СтруктураРеквизитов, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ВертикальныйВариант

Процедура ПодготовитьВертикальныйВариант(ДокументВладелец, Настройки, ЭтоПредопределенныйВариант)
	
	Если СвойстваРегистров.Количество() = 0 Тогда 
		Возврат;
	КонецЕсли;
	
	НаборыДанных = НаборыДанныхОтчета(ДокументВладелец, Истина);
	
	ОсновнойНаборДанных = СхемаКомпоновкиДанных.НаборыДанных["Main"]; // НаборДанныхОбъединениеСхемыКомпоновкиДанных
	ЭлементыНаборовДанных = ОсновнойНаборДанных.Элементы;
	
	ИндексНабора = 0;
	Для Каждого НаборДанных Из НаборыДанных Цикл
	
		ИндексНабора = ИндексНабора + 1;
		ИмяНабора = "ЗапросПо" + НаборДанных.ПолноеИмяРегистра;
		ЭлементНабораДанных = ЭлементыНаборовДанных.Найти(ИмяНабора);
	
		Если ЭлементНабораДанных = Неопределено Тогда
	
			ЭлементНабораДанных = ЭлементыНаборовДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
			ЭлементНабораДанных.Имя = ИмяНабора;
			ЭлементНабораДанных.ИсточникДанных = "ИсточникДанных1";
	
			ЭлементНабораДанных.Запрос = НаборДанных.ТекстЗапроса;
	
			ДоопределитьМакетСКД(СхемаКомпоновкиДанных, ИндексНабора, НаборДанных.ВидРегистра,
				НаборДанных.ПредставлениеВидаРегистра, НаборДанных.ИмяРегистра);
	
		КонецЕсли;
		
		Если ЭтоПредопределенныйВариант Тогда 
			ПодготовитьВертикальныйВариантНабораДанных(Настройки, НаборДанных, ЭлементНабораДанных);
		КонецЕсли;
	
	КонецЦикла;
	
	СкрытьПараметрыИОтборы(Настройки);
	
КонецПроцедуры

Процедура ПодготовитьВертикальныйВариантНабораДанных(НастройкиКД, НаборДанных, НаборДанныхКД)
	
	Если НаборДанных.ВидРегистра = "РегистрНакопления" Или НаборДанных.ВидРегистра = "РегистрСведений" Тогда
	
		ПодготовитьВертикальныйВариантРегистровНакопленияИСведений(НастройкиКД, НаборДанныхКД, НаборДанных);
	
	ИначеЕсли НаборДанных.ВидРегистра = "РегистрБухгалтерии" Тогда
	
		ПодготовитьГоризонтальныйВариантРегистровБухгалтерии(НастройкиКД, НаборДанныхКД, НаборДанных);
	
	ИначеЕсли НаборДанных.ВидРегистра = "РегистрРасчета" Тогда
	
		ПодготовитьВертикальныйВариантРегистровРасчета(НастройкиКД, НаборДанныхКД, НаборДанных);
	
	КонецЕсли;
	
КонецПроцедуры

Процедура ПодготовитьВертикальныйВариантРегистровНакопленияИСведений(НастройкиКД, НаборДанныхКД, ЭлементДанных)
	
	ВидРегистра            = ЭлементДанных.ВидРегистра;
	ПредставлениеВидаРегистра = ЭлементДанных.ПредставлениеВидаРегистра;
	ИмяРегистра            = ЭлементДанных.ИмяРегистра;
	ПредставлениеРегистра  = ЭлементДанных.ПредставлениеРегистра;
	
	СтруктураСтандартныхРеквизитов = ЭлементДанных.СтандартныеРеквизиты;
	СтруктураИзмерений             = ЭлементДанных.Измерения;
	СтруктураРесурсов              = ЭлементДанных.Ресурсы;
	СтруктураРеквизитов            = ЭлементДанных.Реквизиты;
	СтруктураНумератора            = ЭлементДанных.Нумератор; 
	
	Заголовок = ПредставлениеВидаРегистра + " " + ПредставлениеРегистра;
	ГруппировкаДетальныеЗаписи = ДетальныеЗаписиПоРегистру(НастройкиКД, ВидРегистра + "_" + ИмяРегистра, Заголовок);
	
	Если СтруктураНумератора.Количество() > 0 Тогда
	
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Нумератор");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", "№ГруппаЭлементаВыводаСКДТекущегоДокумента");
		
		РазместитьГруппуПолейСКД(СтруктураНумератора, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураСтандартныхРеквизитов.Количество() > 0 Тогда
	
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "СтандартныеРеквизиты");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", НСтр("ru = 'Стандартные реквизиты'"));
		
		РазместитьГруппуПолейСКД(СтруктураСтандартныхРеквизитов, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураИзмерений.Количество() > 0 Тогда
	
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Измерения");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", НСтр("ru = 'Измерения'"));
		
		РазместитьГруппуПолейСКД(СтруктураИзмерений, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураРесурсов.Количество() > 0 Тогда
	
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Ресурсы");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", НСтр("ru = 'Ресурсы'"));
		
		РазместитьГруппуПолейСКД(СтруктураРесурсов, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураРеквизитов.Количество() > 0 Тогда
	
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Реквизиты");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", НСтр("ru = 'Реквизиты'"));
		
		РазместитьГруппуПолейСКД(СтруктураРеквизитов, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
КонецПроцедуры

Процедура ПодготовитьВертикальныйВариантРегистровРасчета(НастройкиКД, НаборДанныхКД, ЭлементДанных)
	
	ВидРегистра            = "РегистрРасчета";
	ИмяРегистра            = ЭлементДанных.ИмяРегистра;
	ПредставлениеРегистра  = ЭлементДанных.ПредставлениеРегистра;
	
	СтруктураСтандартныхРеквизитов = ЭлементДанных.СтандартныеРеквизиты;
	СтруктураИзмерений             = ЭлементДанных.Измерения;
	СтруктураРесурсов              = ЭлементДанных.Ресурсы;
	СтруктураРеквизитов            = ЭлементДанных.Реквизиты;
	СтруктураНумератора            = ЭлементДанных.Нумератор;
	
	ПользовательскийЗаголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Регистр расчета %1'"),
		ПредставлениеРегистра);
	
	ГруппировкаДетальныеЗаписи = ДетальныеЗаписиПоРегистру(НастройкиКД, ВидРегистра + "_" + ИмяРегистра,
		ПользовательскийЗаголовок);
	
	Если СтруктураНумератора.Количество() > 0 Тогда
		
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Нумератор");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", "№ГруппаЭлементаВыводаСКДТекущегоДокумента");
		
		РазместитьГруппуПолейСКД(СтруктураНумератора, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
		
	КонецЕсли;
	
	Если СтруктураСтандартныхРеквизитов.Количество() > 0 Тогда
		
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "СтандартныеРеквизиты");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", НСтр("ru = 'Стандартные реквизиты'"));
		
		РазместитьГруппуПолейСКД(СтруктураСтандартныхРеквизитов, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
		
	КонецЕсли;
	
	Если СтруктураИзмерений.Количество() > 0 Тогда
		
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Измерения");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", НСтр("ru = 'Измерения'"));
		
		РазместитьГруппуПолейСКД(СтруктураИзмерений, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
		
	КонецЕсли;
	
	Если СтруктураРесурсов.Количество() > 0 Тогда
		
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Ресурсы");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", НСтр("ru = 'Ресурсы'"));
		
		РазместитьГруппуПолейСКД(СтруктураРесурсов, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
		
	КонецЕсли;
	
	Если СтруктураРеквизитов.Количество() > 0 Тогда
		
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Реквизиты");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Ложь);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", НСтр("ru = 'Реквизиты'"));
		
		РазместитьГруппуПолейСКД(СтруктураРеквизитов, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ФормированиеСтруктурыОтчета

Процедура ПодготовитьГоризонтальныйВариантРегистровБухгалтерии(НастройкиКД, НаборДанныхКД, ЭлементДанных)
	
	ВидРегистра            = "РегистрБухгалтерии";
	ИмяРегистра            = ЭлементДанных.ИмяРегистра;
	ПредставлениеРегистра  = ЭлементДанных.ПредставлениеРегистра;
	
	СтруктураСтандартныхРеквизитов = ЭлементДанных.СтандартныеРеквизиты;
	СтруктураИзмерений             = ЭлементДанных.Измерения;
	СтруктураИзмеренийДт           = ЭлементДанных.ИзмеренияДт;
	СтруктураИзмеренийКт           = ЭлементДанных.ИзмеренияКт;
	СтруктураРесурсов              = ЭлементДанных.Ресурсы;
	СтруктураРесурсовДт            = ЭлементДанных.РесурсыДт;
	СтруктураРесурсовКт            = ЭлементДанных.РесурсыКт;
	СтруктураСубконто              = ЭлементДанных.Субконто;
	СтруктураСубконтоДт            = ЭлементДанных.СубконтоДт;
	СтруктураСубконтоКт            = ЭлементДанных.СубконтоКт;
	СтруктураРеквизитов            = ЭлементДанных.Реквизиты;
	
	ПользовательскийЗаголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Регистр бухгалтерии %1'"),
		ПредставлениеРегистра);
	
	ГруппировкаДетальныеЗаписи = ДетальныеЗаписиПоРегистру(НастройкиКД,
		ВидРегистра + "_" + ИмяРегистра, ПользовательскийЗаголовок);
	
	Если СтруктураСтандартныхРеквизитов.Количество() > 0 Тогда
		
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "СтандартныеРеквизиты");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Истина);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", "");
		
		РазместитьГруппуПолейСКД(СтруктураСтандартныхРеквизитов, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураИзмерений.Количество() > 0 Тогда
	
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Измерения");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  Неопределено);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Истина);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", "");
		
		РазместитьГруппуПолейСКД(СтруктураИзмерений, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураИзмеренийДт.Количество() > 0 Тогда
	
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "ИзмеренияДт");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Истина);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", "");
		
		РазместитьГруппуПолейСКД(СтруктураИзмеренийДт, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураСубконто.Количество() > 0 Тогда
	
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Субконто");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Истина);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", "");
		
		РазместитьГруппуПолейСКД(СтруктураСубконто, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураСубконтоДт.Количество() > 0 Тогда
	
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "СубконтоДт");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Истина);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", "");
		
		РазместитьГруппуПолейСКД(СтруктураСубконтоДт, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураРесурсовДт.Количество() > 0 Тогда
	
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "РесурсыДт");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Истина);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", "");
		
		РазместитьГруппуПолейСКД(СтруктураРесурсовДт, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураИзмеренийКт.Количество() > 0 Тогда
	
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "ИзмеренияКт");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Истина);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", "");
		
		РазместитьГруппуПолейСКД(СтруктураИзмеренийКт, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураСубконтоКт.Количество() > 0 Тогда
	
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "СубконтоКт");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Истина);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", "");
		
		РазместитьГруппуПолейСКД(СтруктураСубконтоКт, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураРесурсовКт.Количество() > 0 Тогда
	
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "РесурсыКт");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  РасположениеПоляКомпоновкиДанных.Вертикально);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Истина);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", "");
		
		РазместитьГруппуПолейСКД(СтруктураРесурсовКт, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураРесурсов.Количество() > 0 Тогда
	
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Ресурсы");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  Неопределено);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Истина);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", "");
		
		РазместитьГруппуПолейСКД(СтруктураРесурсов, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
	Если СтруктураРеквизитов.Количество() > 0 Тогда
	
		ПараметрыГруппы = Новый Структура;
		ПараметрыГруппы.Вставить("ИмяГруппы",                    "Реквизиты");
		ПараметрыГруппы.Вставить("РасположениеВыбраннойГруппы",  Неопределено);
		ПараметрыГруппы.Вставить("ВыбраннаяГруппаПуста",         Истина);
		ПараметрыГруппы.Вставить("ПредставлениеВыбраннойГруппы", "");
		
		РазместитьГруппуПолейСКД(СтруктураРеквизитов, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра);
	
	КонецЕсли;
	
КонецПроцедуры

// Добавляет поле набора данных.
// 
// Параметры:
//   НаборДанных - НаборДанныхОбъединениеСхемыКомпоновкиДанных,
//               - НаборДанныхЗапросСхемыКомпоновкиДанных,
//               - НаборДанныхОбъектСхемыКомпоновкиДанных,
//               - Неопределено
//   Поле - Строка
//   Заголовок - Строка
//   ПутьКДанным - Неопределено
//               - Строка
//
// Возвращаемое значение:
//   ПолеНабораДанныхСхемыКомпоновкиДанных, ПапкаПолейНабораДанныхСхемыКомпоновкиДанных - Описание
//
Функция ДобавитьПолеНабораДанных(НаборДанных, Поле, Заголовок, ПутьКДанным = Неопределено)
	
	Если ПутьКДанным = Неопределено Тогда
		ПутьКДанным = Поле;
	КонецЕсли;
	
	ПолеНабораДанных             = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
	ПолеНабораДанных.Поле        = Поле;
	ПолеНабораДанных.Заголовок   = Заголовок;
	ПолеНабораДанных.ПутьКДанным = ПутьКДанным;
	Возврат ПолеНабораДанных;
	
КонецФункции

Функция ДобавитьВыбранноеПоле(Куда, ИмяИлиПолеКД, Заголовок = "") Экспорт
	
	Если ТипЗнч(Куда) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
		ВыбранныеПоляКД = Куда.Настройки.Выбор;
	ИначеЕсли ТипЗнч(Куда) = Тип("НастройкиКомпоновкиДанных") Или ТипЗнч(Куда) = Тип("ГруппировкаКомпоновкиДанных") Тогда
		ВыбранныеПоляКД = Куда.Выбор;
	Иначе
		ВыбранныеПоляКД = Куда;
	КонецЕсли;
	
	Если ТипЗнч(ИмяИлиПолеКД) = Тип("Строка") Тогда
		ПолеКД = Новый ПолеКомпоновкиДанных(ИмяИлиПолеКД);
	Иначе
		ПолеКД = ИмяИлиПолеКД;
	КонецЕсли;
	
	ВыбранноеПолеКД      = ВыбранныеПоляКД.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
	ВыбранноеПолеКД.Поле = ПолеКД;
	
	Если Заголовок <> "" Тогда
		ВыбранноеПолеКД.Заголовок = Заголовок;
	КонецЕсли;
	
	Возврат ВыбранноеПолеКД;
	
КонецФункции

Функция ДобавитьВыбранноеПолеГруппа(Куда, ИмяИлиПолеКД, Заголовок = "", Расположение = Неопределено)
	
	Если ТипЗнч(Куда) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
		ВыбранныеПоляКД = Куда.Настройки.Выбор;
	ИначеЕсли ТипЗнч(Куда) = Тип("НастройкиКомпоновкиДанных") Или ТипЗнч(Куда) = Тип("ГруппировкаКомпоновкиДанных") Тогда
		ВыбранныеПоляКД = Куда.Выбор;
	Иначе
		ВыбранныеПоляКД = Куда;
	КонецЕсли;
	
	Если ТипЗнч(ИмяИлиПолеКД) = Тип("Строка") Тогда
		ПолеКД = Новый ПолеКомпоновкиДанных(ИмяИлиПолеКД);
	Иначе
		ПолеКД = ИмяИлиПолеКД;
	КонецЕсли;
	
	ВыбранноеПолеКД      = ВыбранныеПоляКД.Элементы.Добавить(Тип("ГруппаВыбранныхПолейКомпоновкиДанных"));
	ВыбранноеПолеКД.Поле = ПолеКД;
	
	Если Расположение <> Неопределено Тогда
		ВыбранноеПолеКД.Расположение = Расположение;
	КонецЕсли;
	
	Если Заголовок <> "" Тогда
		ВыбранноеПолеКД.Заголовок = Заголовок;
	КонецЕсли;
	
	Возврат ВыбранноеПолеКД;
	
КонецФункции

Процедура ДобавитьРесурсРасчетаКоличестваЗаписей(Схема)
	
	ПолеКоличестваЗаписей = Схема.ПоляИтога.Найти("КоличествоЗаписейРегистра");
	Если ПолеКоличестваЗаписей <> Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПолеИтога = Схема.ПоляИтога.Добавить();
	ПолеИтога.Группировки.Добавить("ИмяРегистра");
	ПолеИтога.ПутьКДанным = "КоличествоЗаписейРегистра";
	ПолеИтога.Выражение = "Сумма(КоличествоЗаписейРегистра)";
	
КонецПроцедуры

#КонецОбласти

#Область Прочее

Процедура УстановитьНастройки(Группировка, Настройки)

	Для Каждого ЭлементНастройки Из Настройки Цикл
	
		Настройка = Группировка.ПараметрыВывода.Элементы.Найти(ЭлементНастройки.Ключ);
		Если Настройка <> Неопределено Тогда
			УстановитьПараметрВывода(Группировка, ЭлементНастройки.Ключ, ЭлементНастройки.Значение);
		КонецЕсли;
	
	КонецЦикла;
	
КонецПроцедуры

Функция ДетальныеЗаписиПоРегистру(НастройкиКД, ИмяГруппировки, ПользовательскийЗаголовок)
	
	ГруппировкаПоРегистру = НастройкиКД.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	ГруппировкаПоРегистру.Имя                                    = ИмяГруппировки;
	ГруппировкаПоРегистру.ПредставлениеПользовательскойНастройки = ПользовательскийЗаголовок;
	ГруппировкаПоРегистру.Использование                          = Истина;
	
	ГруппировкаПоРегистру.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	ГруппировкаПоРегистру.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
	
	СкрытьОтборВТаблицеДвижений(ГруппировкаПоРегистру);
	
	ПолеГруппировкиПоРегистру = ГруппировкаПоРегистру.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
	ПолеГруппировкиПоРегистру.Использование  = Истина;
	ПолеГруппировкиПоРегистру.Поле           = Новый ПолеКомпоновкиДанных("ИмяРегистра");
	ПолеГруппировкиПоРегистру.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
	ПолеГруппировкиПоРегистру.ТипДополнения  = ТипДополненияПериодаКомпоновкиДанных.БезДополнения;
	
	ДетальныеЗаписиПоРегистру = ГруппировкаПоРегистру.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	ДетальныеЗаписиПоРегистру.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
	ДетальныеЗаписиПоРегистру.Использование = Истина;
	
	Возврат ДетальныеЗаписиПоРегистру;
	
КонецФункции

Процедура РазместитьГруппуПолейСКД(СтруктураПолей, НаборДанныхКД, ГруппировкаДетальныеЗаписи, ПараметрыГруппы, ВидРегистра, ИмяРегистра)
	
	Если ПараметрыГруппы.ВыбраннаяГруппаПуста Тогда
		ЛокальноеИмяГруппы     = Новый ПолеКомпоновкиДанных("");
		ЛокальноеПредставлениеГруппы = "";
	Иначе
		ЛокальноеИмяГруппы           = ПараметрыГруппы.ИмяГруппы;
		ЛокальноеПредставлениеГруппы = ПараметрыГруппы.ПредставлениеВыбраннойГруппы;
	КонецЕсли;
	
	Группа = ДобавитьВыбранноеПолеГруппа(ГруппировкаДетальныеЗаписи, ЛокальноеИмяГруппы, ЛокальноеПредставлениеГруппы,
		ПараметрыГруппы.РасположениеВыбраннойГруппы);
	
	Для Каждого ЭлементСтруктуры Из СтруктураПолей Цикл
	
		Имя           = ЭлементСтруктуры.Ключ;
		Представление = ЭлементСтруктуры.Значение;
		ИмяГруппы     = ПараметрыГруппы.ИмяГруппы;
		
		Если ИмяГруппы <> "СтандартныеРеквизиты" И ИмяГруппы <> "Нумератор" И ИмяГруппы <> "ИзмеренияДт"
			И ИмяГруппы <> "ИзмеренияКт" И ИмяГруппы <> "РесурсыДт" И ИмяГруппы <> "РесурсыКт" И ИмяГруппы <> "СубконтоДт"
			И ИмяГруппы <> "СубконтоКт" И ИмяГруппы <> "Субконто" Тогда
			
			Если ВидРегистра = "РегистрНакопления" Тогда
				ОбъектМетаданных = Метаданные.РегистрыНакопления[ИмяРегистра][ИмяГруппы][Имя];
			ИначеЕсли ВидРегистра = "РегистрСведений" Тогда
				ОбъектМетаданных = Метаданные.РегистрыСведений[ИмяРегистра][ИмяГруппы][Имя];
			ИначеЕсли ВидРегистра = "РегистрРасчета" Тогда
				ОбъектМетаданных = Метаданные.РегистрыРасчета[ИмяРегистра][ИмяГруппы][Имя];
			ИначеЕсли ВидРегистра = "РегистрБухгалтерии" Тогда
				ОбъектМетаданных = Метаданные.РегистрыБухгалтерии[ИмяРегистра][ИмяГруппы][Имя];
			КонецЕсли;
			
			Если Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ОбъектМетаданных) Тогда
				Продолжить;
			КонецЕсли;
			
		КонецЕсли;
	
		ДобавитьПолеНабораДанных(НаборДанныхКД, Имя, Представление);
		ДобавитьВыбранноеПоле(Группа, Имя, Представление);
	
	КонецЦикла;
	
КонецПроцедуры

Процедура ДобавитьПоля(СписокПолей, Знач ИменаПредставленияПолей, Знач МетаданныеРегистра, Знач ИмяКоллекции = "")
	
	Для Каждого Поле Из ИменаПредставленияПолей Цикл
		Если Не ЗначениеЗаполнено(ИмяКоллекции) 
			Или ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(МетаданныеРегистра[ИмяКоллекции][Поле.Ключ]) Тогда
			СписокПолей.Добавить(Поле.Ключ);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Функция ИменаПредставленияПолей(ПоляРегистра, Знач ИсключаемыеПоля = Неопределено)
	
	Если ИсключаемыеПоля = Неопределено Тогда
		ИсключаемыеПоля = Новый Массив;
	КонецЕсли;
	
	ИсключаемыйТип = Тип("ХранилищеЗначения");
	
	Результат = Новый Структура;
	Для Каждого ПолеРегистра Из ПоляРегистра Цикл
	
		Если ИсключаемыеПоля.Найти(ПолеРегистра.Имя) = Неопределено
			И Не ПолеРегистра.Тип.СодержитТип(ИсключаемыйТип) Тогда 
			
			Результат.Вставить(ПолеРегистра.Имя, ПолеРегистра.Представление());
		КонецЕсли;
	
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Функция НомераПолей(НаборДанных)
	
	Результат = Новый Структура;
	
	МаксимальныйНомер = Макс(НаборДанных.СтандартныеРеквизиты.Количество(),
		НаборДанных.Измерения.Количество(),
		НаборДанных.Ресурсы.Количество(),
		НаборДанных.Реквизиты.Количество());
			
	Для Индекс = 1 По МаксимальныйНомер Цикл
		ИндексСтрокой = Формат(Индекс, "ЧГ=0");
		Результат.Вставить("ГруппаЭлементаВыводаСКДТекущегоДокумента" + ИндексСтрокой, ИндексСтрокой);
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

#КонецОбласти

#КонецОбласти

#Область ВыводСКД

Процедура ОформитьРезультат(Настройки, ДокументРезультат, ДокументРегистратор)
	
	ЗаполнитьПримечания(Настройки);
	
 	ПолноеИмяРегистра = Неопределено;
	
	Для НомерСтроки = 1 По ДокументРезультат.ВысотаТаблицы Цикл
		
		Для НомерКолонки = 1 По 2 Цикл // поиск заголовка таблицы в первых двух колонках
	
			Область = ДокументРезультат.Область(НомерСтроки, НомерКолонки);
			
			СвойстваРегистра = СвойстваРегистра(Область.Текст);
			Если СвойстваРегистра = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			
			ПолноеИмяРегистра = СвойстваРегистра.ПолноеИмяРегистра;
			
			РасшифровкаЗаголовка = Новый Структура;
			РасшифровкаЗаголовка.Вставить("ВидРегистра", СвойстваРегистра.ВидРегистра);
			РасшифровкаЗаголовка.Вставить("ИмяРегистра", СвойстваРегистра.ИмяРегистра);
			РасшифровкаЗаголовка.Вставить("Регистратор", ДокументРегистратор);
			РасшифровкаЗаголовка.Вставить("ИмяПоляРегистратора", СвойстваРегистра.ИмяПоляРегистратора);
			
			Область.Расшифровка  = РасшифровкаЗаголовка;
			ОтчетыСервер.ВывестиГиперссылку(Область, РасшифровкаЗаголовка, Область.Текст);
			
			ГраницаПримечаний = 1;
			
			Прервать;
		КонецЦикла;
		
		ОбластьНумератора = ДокументРезультат.Область(НомерСтроки, 1);
	
		Если Не ЭтоЧисло(ОбластьНумератора.Текст) Тогда
			
			Если СтрНайти(ОбластьНумератора.Текст, "№ГруппаЭлементаВыводаСКДТекущегоДокумента") > 0 Тогда
				ОбластьНумератора.Текст = "№";
				ОбластьНумератора.ШиринаКолонки = 5;
			КонецЕсли;
			
			Продолжить;
		КонецЕсли;
	
		ОбластьНумератора.Отступ = 0;
		ОбластьНумератора.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Лево;

		Если ПолноеИмяРегистра = Неопределено
			Или Примечания = Неопределено Тогда 
			
			Продолжить;
		КонецЕсли;
		
		Поиск = Новый Структура("ПолноеИмяРегистра, Этаж", ПолноеИмяРегистра, ОбластьНумератора.Текст);
		НайденныеПримечания = Примечания.НайтиСтроки(Поиск); // Массив из СтрокаТаблицыЗначений
		
		Если НайденныеПримечания.Количество() = 0 Тогда 
			Продолжить;
		КонецЕсли;
		
		СвойстваПримечания = НайденныеПримечания[0];
		
		ЭтажностьСтроки = СвойстваПримечания.Этажность + 1;
		Если ГраницаПримечаний = ЭтажностьСтроки Тогда
			
			ТекстПримечания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'В этой строке: %1'"), СвойстваПримечания.Примечание + ".");
			
			ОбластьНумератора.Примечание.Текст = ТекстПримечания;
		Иначе
			ГраницаПримечаний = ГраницаПримечаний + 1;
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#Область РазделОформления

Процедура СкрытьПараметрыИОтборы(НастройкиКД)
	
	Настройки = Новый Структура;
	Настройки.Вставить("ВыводитьОтбор",           ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
	Настройки.Вставить("ВыводитьПараметрыДанных", ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
	УстановитьНастройки(НастройкиКД, Настройки);
	
КонецПроцедуры

Процедура СкрытьОтборВТаблицеДвижений(ГруппировкаПоРегистру)
	
	Настройки = Новый Структура;
	Настройки.Вставить("ВыводитьОтбор", ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
	УстановитьНастройки(ГруппировкаПоРегистру, Настройки);
	
КонецПроцедуры

Процедура УстановитьУсловноеОформление(Настройки)
	
	ЭлементыОформления = Настройки.УсловноеОформление.Элементы;
	
	ОформитьОтрицательныеЧисла(ЭлементыОформления);
	ОформитьРесурсы(Настройки);
	
	Если СвойстваРегистров.Найти("Остатки", "ВидРегистраНакопления") = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	ОформитьВидДвижения(ЭлементыОформления, ВидДвиженияНакопления.Приход);
	ОформитьВидДвижения(ЭлементыОформления, ВидДвиженияНакопления.Расход);
	
КонецПроцедуры

Процедура ОформитьОтрицательныеЧисла(ЭлементыОформления)
	
	Элемент = ЭлементыОформления.Добавить();
	
	ЭлементОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПараметрыДанных.ОтрицательноеКрасным");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ВыделятьОтрицательные", Истина);
	
	Элемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	Элемент.Использование = Истина;
	
КонецПроцедуры

Процедура ОформитьВидДвижения(ЭлементыОформления, ВидДвижения)
	
	ПолеВидДвижения = Новый ПолеКомпоновкиДанных("ВидДвижения");
	
	Элемент = ЭлементыОформления.Добавить();
	
	ЭлементОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПараметрыДанных.ВыделятьВидДвиженияНакопления");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Истина;
	
	ЭлементОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = ПолеВидДвижения;
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = ВидДвижения;
	
	ОформляемыеПоля = Элемент.Поля.Элементы;
	ОформляемоеПоле = ОформляемыеПоля.Добавить();
	ОформляемоеПоле.Поле = ПолеВидДвижения;
	
	Элемент.ИспользоватьВЗаголовке = ИспользованиеУсловногоОформленияКомпоновкиДанных.НеИспользовать;
	Элемент.ИспользоватьВЗаголовкеПолей = ИспользованиеУсловногоОформленияКомпоновкиДанных.НеИспользовать;
	
	Если ВидДвижения = ВидДвиженияНакопления.Приход Тогда 
		ЦветВидаДвижения = Метаданные.ЭлементыСтиля.РезультатУспехЦвет.Значение;
	Иначе
		ЦветВидаДвижения = ЦветаСтиля.ЦветОтрицательногоЧисла;
	КонецЕсли;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветВидаДвижения);
	Элемент.Использование = Истина;
	
КонецПроцедуры

Процедура ОформитьРесурсы(Настройки)
	
	Для Каждого СвойстваРегистра Из СвойстваРегистров Цикл 
		
		ФорматыРесурсов = СвойстваРегистра.ФорматыРесурсов;
		
		Если ФорматыРесурсов.Количество() = 0 Тогда 
			Продолжить;
		КонецЕсли;
		
		ДетальныеЗаписиРегистра = ДетальныеЗаписиРегистра(Настройки, СвойстваРегистра);
		
		Если ДетальныеЗаписиРегистра = Неопределено Тогда 
			Продолжить;
		КонецЕсли;
		
		ЭлементыОформления = ДетальныеЗаписиРегистра.УсловноеОформление.Элементы;
		
		Для Каждого ФорматРесурса Из ФорматыРесурсов Цикл 
			
			Элемент = ЭлементыОформления.Добавить();
			
			Для Каждого Ресурс Из ФорматРесурса.Значение Цикл 
				
				ОформляемоеПоле = Элемент.Поля.Элементы.Добавить();
				ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(Ресурс);
				
			КонецЦикла;
			
			Элемент.Оформление.УстановитьЗначениеПараметра("Формат", ФорматРесурса.Ключ);
			
			Элемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
			Элемент.Использование = Истина;
			
		КонецЦикла;
		
	КонецЦикла;
	
КонецПроцедуры

Функция ДетальныеЗаписиРегистра(Настройки, СвойстваРегистра, ЭлементыСтруктуры = Неопределено, ДетальныеЗаписиРегистра = Неопределено)
	
	Если ЭлементыСтруктуры = Неопределено Тогда 
		
		ГруппировкаРегистра = ГруппировкаРегистра(Настройки.Структура, СвойстваРегистра);
		
		Если ГруппировкаРегистра = Неопределено Тогда 
			Возврат Неопределено;
		КонецЕсли;
		
		ЭлементыСтруктуры = ГруппировкаРегистра.Структура;
		
	КонецЕсли;
	
	Для Каждого ЭлементСтруктуры Из ЭлементыСтруктуры Цикл 
		
		Если ТипЗнч(ЭлементСтруктуры) <> Тип("ГруппировкаКомпоновкиДанных") Тогда 
			Продолжить;
		КонецЕсли;
		
		Если ЭлементСтруктуры.ПоляГруппировки.Элементы.Количество() = 0 Тогда 
			ДетальныеЗаписиРегистра = ЭлементСтруктуры;
		Иначе
			ДетальныеЗаписиРегистра(Настройки, СвойстваРегистра, ЭлементСтруктуры.Структура, ДетальныеЗаписиРегистра);
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат ДетальныеЗаписиРегистра;
	
КонецФункции

Функция ГруппировкаРегистра(ЭлементыСтруктуры, СвойстваРегистра)
	
	Для Каждого ЭлементСтруктуры Из ЭлементыСтруктуры Цикл 
		
		Если ТипЗнч(ЭлементСтруктуры) <> Тип("ГруппировкаКомпоновкиДанных") Тогда 
			Продолжить;
		КонецЕсли;
		
		Если ЭлементСтруктуры.Имя = СвойстваРегистра.ИмяГруппировки Тогда 
			Возврат ЭлементСтруктуры;
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Неопределено;
	
КонецФункции

#КонецОбласти

#Область ПолучениеСвойствРегистров

Процедура ПолучитьСвойстваРегистров(Контекст, ДокументВладелец = Неопределено)
	
	СвойстваРегистров(Контекст);
	
	Если СвойстваРегистров.Количество() > 0
		Или ДокументВладелец = Неопределено Тогда 
		
		КэшироватьСвойстваРегистров(СвойстваРегистров, Контекст);
		Возврат;
	КонецЕсли;
	
	ДвиженияДокумента = РегистрыСДвижениямиДокумента(ДокументВладелец);
	КоличествоЗаписей = КоличествоЗаписейПоРегистратору(ДокументВладелец, ДвиженияДокумента);
	
	Для Каждого Движение Из ДвиженияДокумента Цикл
		
		МетаданныеРегистра = Движение.Ключ; // ОбъектМетаданныхРегистрСведений, ОбъектМетаданныхРегистрНакопления, ОбъектМетаданныхРегистрРасчета
		
		СвойстваРегистра = СвойстваРегистров.Добавить();
		СвойстваРегистра.ИмяПоляРегистратора = Движение.Значение;
		СвойстваРегистра.ПолноеИмяРегистра = МетаданныеРегистра.ПолноеИмя();
		СвойстваРегистра.ИмяГруппировки = СтрЗаменить(СвойстваРегистра.ПолноеИмяРегистра, ".", "_");
		СвойстваРегистра.ИмяРегистра = МетаданныеРегистра.Имя;
		СвойстваРегистра.ПредставлениеРегистра = МетаданныеРегистра.Представление();
		СвойстваРегистра.КоличествоЗаписей = КоличествоЗаписей[СвойстваРегистра.ИмяГруппировки];
		
		Если ОбщегоНазначения.ЭтоРегистрНакопления(МетаданныеРегистра) Тогда
			
			СвойстваРегистра.ВидРегистра = "РегистрНакопления";
			СвойстваРегистра.ПредставлениеВидаРегистра = НСтр("ru = 'Регистр накопления'");
			СвойстваРегистра.ВидРегистраНакопления = МетаданныеРегистра.ВидРегистра;
			СвойстваРегистра.Приоритет = 1;
			
		ИначеЕсли ОбщегоНазначения.ЭтоРегистрСведений(МетаданныеРегистра) Тогда
			
			СвойстваРегистра.ВидРегистра = "РегистрСведений";
			СвойстваРегистра.ПредставлениеВидаРегистра = НСтр("ru = 'Регистр сведений'");
			СвойстваРегистра.ПериодичностьРегистраСведений = МетаданныеРегистра.ПериодичностьРегистраСведений;
			СвойстваРегистра.РежимЗаписиРегистраСведений = МетаданныеРегистра.РежимЗаписи;
			СвойстваРегистра.Приоритет  = 2;
			
		ИначеЕсли ОбщегоНазначения.ЭтоРегистрБухгалтерии(МетаданныеРегистра) Тогда
			
			СвойстваРегистра.ВидРегистра = "РегистрБухгалтерии";
			СвойстваРегистра.ПредставлениеВидаРегистра = НСтр("ru = 'Регистр бухгалтерии'");
			СвойстваРегистра.Приоритет = 3;
			
		ИначеЕсли ОбщегоНазначения.ЭтоРегистрРасчета(МетаданныеРегистра) Тогда
			
			СвойстваРегистра.ВидРегистра = "РегистрРасчета";
			СвойстваРегистра.ПредставлениеВидаРегистра = НСтр("ru = 'Регистр расчета'");
			СвойстваРегистра.ПериодичностьРегистраРасчета = МетаданныеРегистра.Периодичность;
			СвойстваРегистра.Приоритет = 4;
			
		КонецЕсли;
		
		ЗаголовокТаблицы = СвойстваРегистра.ПредставлениеВидаРегистра + " """ + СвойстваРегистра.ПредставлениеРегистра + """";
		СвойстваРегистра.ЗаголовокТаблицы = ВРег(ЗаголовокТаблицы);
		
		ОпределитьФорматыРесурсов(МетаданныеРегистра, СвойстваРегистра);
		
	КонецЦикла;
	
	СвойстваРегистров.Сортировать("Приоритет, ПредставлениеРегистра");
	СвойстваРегистров.Индексы.Добавить("ИмяГруппировки, ИмяРегистра, ВидРегистра, ВидРегистраНакопления, ЗаголовокТаблицы");
	
	КэшироватьСвойстваРегистров(СвойстваРегистров, Контекст);
	
КонецПроцедуры

Процедура СвойстваРегистров(Контекст)
	
	СвойстваРегистров = НовыеСвойстваРегистров();
	
	Если ТипЗнч(Контекст) = Тип("ФормаКлиентскогоПриложения") Тогда 
		
		АдресСвойствРегистров = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
			Контекст.НастройкиОтчета, "АдресСвойствРегистров");
		
	ИначеЕсли ТипЗнч(Контекст) = Тип("НастройкиКомпоновкиДанных") Тогда 
		
		АдресСвойствРегистров = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
			Контекст.ДополнительныеСвойства, "АдресСвойствРегистров");
	Иначе
		Возврат;
	КонецЕсли;
	
	Если Не ЭтоАдресВременногоХранилища(АдресСвойствРегистров) Тогда 
		Возврат;
	КонецЕсли;
	
	СвойстваРегистровИзКэша = ПолучитьИзВременногоХранилища(АдресСвойствРегистров);
	Если ТипЗнч(СвойстваРегистровИзКэша) = Тип("ТаблицаЗначений") Тогда 
		СвойстваРегистров = СвойстваРегистровИзКэша;
	КонецЕсли;
	
КонецПроцедуры

Процедура КэшироватьСвойстваРегистров(СвойстваРегистров, Контекст)
	
	АдресСвойствРегистров = ПоместитьВоВременноеХранилище(СвойстваРегистров);
	Если ТипЗнч(Контекст) = Тип("ФормаКлиентскогоПриложения") Тогда 
		Контекст.НастройкиОтчета.Вставить("АдресСвойствРегистров", АдресСвойствРегистров);
	ИначеЕсли ТипЗнч(Контекст) = Тип("НастройкиКомпоновкиДанных") Тогда
		Контекст.ДополнительныеСвойства.Вставить("АдресСвойствРегистров", АдресСвойствРегистров);
	КонецЕсли;
	
КонецПроцедуры

// Конструктор коллекции движений документа, каждый элемент которой хранит сведения о регистре,
//  регистратором которого является документ-владелец.
//
// Возвращаемое значение:
//   ТаблицаЗначений:
//     * Приоритет - Число
//     * ПолноеИмяРегистра - Строка
//     * ИмяГруппировки - Строка
//     * ИмяРегистра - Строка
//     * ПредставлениеРегистра - Строка
//     * ВидРегистра - Строка
//     * ВидРегистраНакопления - Строка
//     * ПредставлениеВидаРегистра - Строка
//     * ПериодичностьРегистраРасчета - Строка
//     * ПериодичностьРегистраСведений - Строка
//     * РежимЗаписиРегистраСведений - Строка
//     * ИмяПоляРегистратора - Строка
//     * КоличествоЗаписей - Число
//     * ЗаголовокТаблицы - Строка
//     * ФорматыРесурсов - Соответствие
//
Функция НовыеСвойстваРегистров()
	
	ПалитраСвойствРегистров = Новый ТаблицаЗначений;
	
	ОписаниеЧисла = Новый ОписаниеТипов("Число");
	ОписаниеСтроки = Новый ОписаниеТипов("Строка");
	ОписаниеСоответствия = Новый ОписаниеТипов("Соответствие");
	
	ПалитраСвойствРегистров.Колонки.Добавить("Приоритет", ОписаниеЧисла);
	ПалитраСвойствРегистров.Колонки.Добавить("ПолноеИмяРегистра", ОписаниеСтроки);
	ПалитраСвойствРегистров.Колонки.Добавить("ИмяГруппировки", ОписаниеСтроки);
	ПалитраСвойствРегистров.Колонки.Добавить("ИмяРегистра", ОписаниеСтроки);
	ПалитраСвойствРегистров.Колонки.Добавить("ПредставлениеРегистра", ОписаниеСтроки);
	ПалитраСвойствРегистров.Колонки.Добавить("ВидРегистра", ОписаниеСтроки);
	ПалитраСвойствРегистров.Колонки.Добавить("ВидРегистраНакопления", ОписаниеСтроки);
	ПалитраСвойствРегистров.Колонки.Добавить("ПредставлениеВидаРегистра", ОписаниеСтроки);
	ПалитраСвойствРегистров.Колонки.Добавить("ПериодичностьРегистраРасчета", ОписаниеСтроки);
	ПалитраСвойствРегистров.Колонки.Добавить("ПериодичностьРегистраСведений", ОписаниеСтроки);
	ПалитраСвойствРегистров.Колонки.Добавить("РежимЗаписиРегистраСведений", ОписаниеСтроки);
	ПалитраСвойствРегистров.Колонки.Добавить("ИмяПоляРегистратора", ОписаниеСтроки);
	ПалитраСвойствРегистров.Колонки.Добавить("КоличествоЗаписей", ОписаниеЧисла);
	ПалитраСвойствРегистров.Колонки.Добавить("ЗаголовокТаблицы", ОписаниеСтроки);
	ПалитраСвойствРегистров.Колонки.Добавить("ФорматыРесурсов", ОписаниеСоответствия);
	
	Возврат ПалитраСвойствРегистров;
	
КонецФункции

Процедура ОпределитьФорматыРесурсов(МетаданныеРегистра, СвойстваРегистра)
	
	ШаблонФорматаРесурса = "ЧЦ=%1; ЧДЦ=%2; ЧРГ=' '";
	ЭтоРегистрБухгалтерии = ОбщегоНазначения.ЭтоРегистрБухгалтерии(МетаданныеРегистра);
	
	Для Каждого Ресурс Из МетаданныеРегистра.Ресурсы Цикл 
		
		ТипРесурса = Ресурс.Тип;
		
		Если Не ТипРесурса.СодержитТип(Тип("Число")) Тогда 
			Продолжить;
		КонецЕсли;
		
		КвалификаторыРесурса = ТипРесурса.КвалификаторыЧисла;
		
		ФорматРесурса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			ШаблонФорматаРесурса, КвалификаторыРесурса.Разрядность, КвалификаторыРесурса.РазрядностьДробнойЧасти);
		
		РесурсыФормата = СвойстваРегистра.ФорматыРесурсов[ФорматРесурса];
		
		Если РесурсыФормата = Неопределено Тогда 
			РесурсыФормата = Новый Массив;
		КонецЕсли;
		
		Если ЭтоРегистрБухгалтерии
			И МетаданныеРегистра.Корреспонденция
			И Не Ресурс.Балансовый Тогда 
			
			РесурсыФормата.Добавить(Ресурс.Имя + "Дт");
			РесурсыФормата.Добавить(Ресурс.Имя + "Кт");
		Иначе
			РесурсыФормата.Добавить(Ресурс.Имя);
		КонецЕсли;
		
		СвойстваРегистра.ФорматыРесурсов.Вставить(ФорматРесурса, РесурсыФормата);
		
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#Область ФормированиеПримечаний

Процедура ЗаполнитьПримечания(Настройки)
	
	Если КлючРодительскогоВарианта <> "Дополнительный" Тогда 
		Возврат;
	КонецЕсли;
	
	Примечания = ПалитраСвойствПримечаний();
	
	Для Каждого СвойстваРегистра Из СвойстваРегистров Цикл 
	
		ГруппыВыбранныхПолей = Новый Массив;
		Группировки = Настройки.Структура;
		НайтиГруппыВыбранныхПолей(Группировки, ГруппыВыбранныхПолей, СвойстваРегистра.ИмяГруппировки);
		
		ПолеНумератора  = Новый ПолеКомпоновкиДанных("Нумератор");
		ЭтажностьСтроки = ЭтажностьСтроки(ПолеНумератора, ГруппыВыбранныхПолей);
		
		Для Индекс = 0 По ЭтажностьСтроки - 1 Цикл
		
			ТекстПримечания = "";
		
			Для Каждого ГруппаПолей Из ГруппыВыбранныхПолей Цикл
				Если ГруппаПолей.Поле = ПолеНумератора Тогда
					Продолжить;
				КонецЕсли;
		
				Заголовок = "";
				ЗаголовокСтандартныхРеквизитов = НСтр("ru = 'Стандартные реквизиты'");
				ЗаголовокИзмерений = НСтр("ru = 'Измерения'");
				ЗаголовокРесурсов = НСтр("ru = 'Ресурсы'");
				ЗаголовокРеквизитов = НСтр("ru = 'Реквизиты'");
				ЗаголовокДанныхРасчетов = НСтр("ru = 'Данные расчета'");
				
				Если ГруппаПолей.Заголовок = ЗаголовокСтандартныхРеквизитов Тогда
					Заголовок = НСтр("ru = 'Стандартный реквизит'");
				ИначеЕсли ГруппаПолей.Заголовок = ЗаголовокИзмерений Тогда
					Заголовок = НСтр("ru = 'Измерение'");
				ИначеЕсли ГруппаПолей.Заголовок = ЗаголовокРесурсов Тогда
					Заголовок = НСтр("ru = 'Ресурс'");
				ИначеЕсли ГруппаПолей.Заголовок = ЗаголовокРеквизитов Тогда
					Заголовок = НСтр("ru = 'Реквизит'");
				ИначеЕсли ГруппаПолей.Заголовок = ЗаголовокДанныхРасчетов Тогда
					Заголовок = НСтр("ru = 'Данные расчета'");
				КонецЕсли;

				Элементы = ГруппаПолей.Элементы; // КоллекцияВыбранныхПолейКомпоновкиДанных

				Если Индекс <= Элементы.Количество() - 1 Тогда
					ВыбранноеПоле = Элементы[Индекс]; // ВыбранноеПолеКомпоновкиДанных
					ЗаголовокПоля = ВыбранноеПоле.Заголовок;
					 
					Если ВыбранноеПоле.Использование Тогда
						ТекстПримечания = ТекстПримечания
							+ ?(ЗначениеЗаполнено(ТекстПримечания), ", ", "")
							+ ЗаголовокПоля + " (" + Заголовок + ")";
					КонецЕсли;
				КонецЕсли;
			КонецЦикла;
			
			Примечание = Примечания.Добавить();
			Примечание.ПолноеИмяРегистра = СвойстваРегистра.ПолноеИмяРегистра;
			Примечание.Примечание = ТекстПримечания;
			Примечание.Этаж = Формат(Индекс + 1, "ЧГ=0");
			Примечание.Этажность = ЭтажностьСтроки;
		
		КонецЦикла;
	
	КонецЦикла;
	
	Примечания.Индексы.Добавить("ПолноеИмяРегистра, Этаж");
	
КонецПроцедуры

// Конструктор коллекции примечаний, каждый элемент которой хранит текст примечания,
//   для нумерованных строк вертикального варианта отчета.
//
// Возвращаемое значение:
//   ТаблицаЗначений:
//     * ПолноеИмяРегистра - Строка
//     * Примечание - Строка
//     * Этаж - Строка
//     * Этажность - Число
//
Функция ПалитраСвойствПримечаний()
	
	ПалитраСвойствПримечаний = Новый ТаблицаЗначений;
	
	ОписаниеЧисла = Новый ОписаниеТипов("Число");
	ОписаниеСтроки = Новый ОписаниеТипов("Строка");
	
	ПалитраСвойствПримечаний.Колонки.Добавить("ПолноеИмяРегистра", ОписаниеСтроки);
	ПалитраСвойствПримечаний.Колонки.Добавить("Примечание", ОписаниеСтроки);
	ПалитраСвойствПримечаний.Колонки.Добавить("Этаж", ОписаниеСтроки);
	ПалитраСвойствПримечаний.Колонки.Добавить("Этажность", ОписаниеЧисла);
	
	Возврат ПалитраСвойствПримечаний;
	
КонецФункции

Функция ЭтажностьСтроки(ПолеНумератора, МассивВыбранныхПолей)
	
	ЭтажностьСтроки = 0;
	Для Каждого ВыбраннаяГруппа Из МассивВыбранныхПолей Цикл
		Если ВыбраннаяГруппа.Поле = ПолеНумератора Тогда
			Элементы = ВыбраннаяГруппа.Элементы;
			Для Каждого Элемент Из Элементы Цикл
				Если Элемент.Использование Тогда
					ЭтажностьСтроки = ЭтажностьСтроки + 1;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	
	Возврат ЭтажностьСтроки;
	
КонецФункции

#КонецОбласти

#Область Прочее

Функция КлючРодительскогоВарианта(Контекст, КлючВарианта, Настройки)
	
	КлючРодительскогоВарианта = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
		Настройки.ДополнительныеСвойства, "КлючРодительскогоВарианта");
	
	Если КлючРодительскогоВарианта <> Неопределено Тогда 
		Возврат КлючРодительскогоВарианта;
	КонецЕсли;
	
	КлючПредопределенногоВарианта = КлючПредопределенногоВарианта(КлючВарианта);
	
	ВариантОтчета = Неопределено;
	Если ТипЗнч(Контекст) = Тип("ФормаКлиентскогоПриложения") Тогда 
		ВариантОтчета = Контекст.НастройкиОтчета.ВариантСсылка;
	ИначеЕсли ТипЗнч(Контекст) = Тип("Структура") Тогда 
		ВариантОтчета = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Контекст, "СсылкаВарианта");
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(ВариантОтчета) Тогда 
		Возврат КлючПредопределенногоВарианта;
	КонецЕсли;
	
	РодительВариантаОтчета = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВариантОтчета, "Родитель");
	
	Если Не ЗначениеЗаполнено(РодительВариантаОтчета) Тогда 
		Возврат КлючПредопределенногоВарианта;
	КонецЕсли;
	
	Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(РодительВариантаОтчета, "КлючВарианта");
	
КонецФункции

Функция КлючПредопределенногоВарианта(КлючВарианта)
	
	КлючПредопределенногоВарианта = Неопределено;
	
	ВариантыНастроек = СхемаКомпоновкиДанных.ВариантыНастроек;
	
	Для Каждого ВариантНастроек Из ВариантыНастроек Цикл 
		
		Если ВариантНастроек.Имя = КлючВарианта Тогда 
			КлючПредопределенногоВарианта = КлючВарианта;
			Прервать;
		КонецЕсли;
		
	КонецЦикла;
	
	Если КлючПредопределенногоВарианта <> Неопределено Тогда 
		Возврат КлючПредопределенногоВарианта;
	КонецЕсли;
	
	Возврат ВариантыНастроек[0].Имя;
	
КонецФункции

// Возвращает коллекцию регистров, на которые текущий пользователь имеет право.
//
// Параметры:
//   Регистратор - ДокументСсылка
//   Движения - КоллекцияДвижений
//            - Неопределено
//
// Возвращаемое значение:
//   Соответствие из КлючИЗначение:
//     * Ключ - ОбъектМетаданныхРегистрСведений
//            - ОбъектМетаданныхРегистрНакопления
//            - ОбъектМетаданныхРегистрРасчета
//     * Значение - Строка
//
Функция РегистрыСДвижениямиДокумента(Регистратор, Движения = Неопределено)
	
	Если Движения = Неопределено Тогда 
		Движения = Регистратор.Метаданные().Движения;
	КонецЕсли;
	
	Результат = Новый Соответствие;
	Для Каждого МетаданныеРегистра Из Движения Цикл
		Если Не ПравоДоступа("Просмотр", МетаданныеРегистра)
			Или Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(МетаданныеРегистра) Тогда
			Продолжить;
		КонецЕсли;
		
		Результат.Вставить(МетаданныеРегистра, "Регистратор");
	КонецЦикла;
	
	ДополнительныеРегистры = Новый Соответствие;
	ОтчетОДвиженияхДокументаПереопределяемый.ПриОпределенииРегистровСДвижениями(Регистратор, ДополнительныеРегистры);
	
	Для Каждого ДополнительныйРегистр Из ДополнительныеРегистры Цикл
		МетаданныеРегистра = ДополнительныйРегистр.Ключ;
		Если Не ПравоДоступа("Просмотр", МетаданныеРегистра)
			Или Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(МетаданныеРегистра) Тогда
			Продолжить;
		КонецЕсли;
		Результат.Вставить(МетаданныеРегистра, ДополнительныйРегистр.Значение);
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Функция КоличествоЗаписейПоРегистратору(Регистратор, ДвиженияДокумента)
	
	РассчитанноеКоличество = Новый Соответствие;
	Если ДвиженияДокумента.Количество() = 0 Тогда
		Возврат РассчитанноеКоличество;
	КонецЕсли;
	
	ТекстЗапроса = "";
	Для Каждого Движение Из ДвиженияДокумента Цикл
		
		МетаданныеРегистра = Движение.Ключ;
		
		Если Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(МетаданныеРегистра) Тогда
			Продолжить;
		КонецЕсли;
		
		ПолноеИмяРегистра = МетаданныеРегистра.ПолноеИмя();
		
		ТекстЗапросаШаблон =
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	""&ПолноеИмяРегистра"" КАК ПолноеИмяРегистра,
		|	КОЛИЧЕСТВО(*) КАК Количество
		|ИЗ
		|	&ТекущаяТаблица КАК ТекущаяТаблица
		|ГДЕ
		|	&Условие";
		
		ТекстУсловия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 = &ДокументВладелец", Движение.Значение);
		ТекстЗапросаШаблон = СтрЗаменить(ТекстЗапросаШаблон, "&ПолноеИмяРегистра", СтрЗаменить(ПолноеИмяРегистра, ".", "_"));
		ТекстЗапросаШаблон = СтрЗаменить(ТекстЗапросаШаблон, "&Условие", ТекстУсловия);
		ТекстЗапросаШаблон = СтрЗаменить(ТекстЗапросаШаблон, "&ТекущаяТаблица", ПолноеИмяРегистра);
		
		Если ЗначениеЗаполнено(ТекстЗапроса) Тогда
			
			ТекстЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				"%1 ОБЪЕДИНИТЬ ВСЕ  %2", ТекстЗапроса, СтрЗаменить(ТекстЗапросаШаблон, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ")); // @query-part-2 @query-part-3 для этого случая
			
		Иначе
			ТекстЗапроса = ТекстЗапросаШаблон;
		КонецЕсли;
		
	КонецЦикла;
	
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("ДокументВладелец", Регистратор);
	Результат = Запрос.Выполнить().Выгрузить();
	
	Для Каждого СтрокаРезультата Из Результат Цикл
		РассчитанноеКоличество.Вставить(СтрокаРезультата.ПолноеИмяРегистра, СтрокаРезультата.Количество);
	КонецЦикла;
	
	ОтчетОДвиженияхДокументаПереопределяемый.ПриРасчетеКоличестваЗаписей(Регистратор, РассчитанноеКоличество);
	
	Возврат РассчитанноеКоличество;
	
КонецФункции

Процедура ДоопределитьМакетСКД(СхемаКД, ИндексНабора, ВидРегистра, ПредставлениеВидаРегистра, ИмяРегистра)
	
	СтруктураПоиска = Новый Структура("ВидРегистра, ИмяРегистра", ВидРегистра, ИмяРегистра);
	НастройкиРегистра = СвойстваРегистров.НайтиСтроки(СтруктураПоиска);
	Если НастройкиРегистра.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
		
	ПредставлениеРегистра = НастройкиРегистра[0].ПредставлениеРегистра;
	ЗаголовокГруппировки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 ""%2""",
		ПредставлениеВидаРегистра, ПредставлениеРегистра);
	
	Макет       = СхемаКД.Макеты.Добавить();
	Макет.Имя   = "Макет" + Формат(ИндексНабора + 1, "ЧГ=0");
	Макет.Макет = Новый МакетОбластиКомпоновкиДанных;
	
	Параметр           = Макет.Параметры.Добавить(Тип("ПараметрОбластиВыражениеКомпоновкиДанных"));
	Параметр.Имя       = "КоличествоЗаписей";
	Параметр.Выражение = "КоличествоЗаписейРегистра";
	
	МакетГруппировки                = СхемаКД.МакетыГруппировок.Добавить();
	МакетГруппировки.ИмяГруппировки = ВидРегистра + "_" + ИмяРегистра;
	МакетГруппировки.ТипМакета      = ТипМакетаОбластиКомпоновкиДанных.Заголовок;
	МакетГруппировки.Макет          = "Макет" + Формат(ИндексНабора + 1, "ЧГ=0");
	
	МакетОбласти = Макет.Макет;
	СтрокаМакета = МакетОбласти.Добавить(Тип("СтрокаТаблицыОбластиКомпоновкиДанных"));
	Ячейка       = СтрокаМакета.Ячейки.Добавить();
	
	ОформлениеЯчейки = Ячейка.Оформление.Элементы;
	
	Шрифт = ОформлениеЯчейки.Найти("Шрифт");
	
	Если Шрифт <> Неопределено Тогда
		ШрифтЗаголовкаГруппировки = Метаданные.ЭлементыСтиля.ЗаголовокГруппировкиОтчетаОДвиженияхДокументаШрифт;
		Шрифт.Значение      = ШрифтЗаголовкаГруппировки.Значение;
		Шрифт.Использование = Истина;
	КонецЕсли;
	
	Размещение = ОформлениеЯчейки.Найти("Размещение");
	
	Если Размещение <> Неопределено Тогда
		Размещение.Значение      = ТипРазмещенияТекстаКомпоновкиДанных.Переносить;
		Размещение.Использование = Истина;
	КонецЕсли;
	
	ОбластьКД          = Ячейка.Элементы.Добавить(Тип("ПолеОбластиКомпоновкиДанных"));
	ОбластьКД.Значение = ЗаголовокГруппировки + " (";
	
	ОбластьКД          = Ячейка.Элементы.Добавить(Тип("ПолеОбластиКомпоновкиДанных"));
	ОбластьКД.Значение = Новый ПараметрКомпоновкиДанных(Параметр.Имя);
	
	ОбластьКД          = Ячейка.Элементы.Добавить(Тип("ПолеОбластиКомпоновкиДанных"));
	ОбластьКД.Значение = ")";
	
КонецПроцедуры

Функция СписокРегистров()
	
	СписокРегистров = Новый СписокЗначений;
	Для Каждого СвойстваРегистра Из СвойстваРегистров Цикл
		ПредставлениеЭлемента = СвойстваРегистра.ПредставлениеВидаРегистра + " " + СвойстваРегистра.ПредставлениеРегистра;
		СписокРегистров.Добавить(СвойстваРегистра.ИмяГруппировки, ПредставлениеЭлемента);
	КонецЦикла;
	Возврат СписокРегистров;
	
КонецФункции

Функция СписокВыбранныхРегистров(СписокРегистров, Настройки, ПользовательскиеНастройки)
	
	ЭлементНастройки = Настройки.ПараметрыДанных.Элементы.Найти("СписокРегистров");
	
	Если ЭлементНастройки = Неопределено Тогда 
		Возврат СписокРегистров;
	КонецЕсли;
	
	ЭлементПользовательскойНастройки = ПользовательскиеНастройки.Элементы.Найти(
		ЭлементНастройки.ИдентификаторПользовательскойНастройки);
	
	Если ЭлементПользовательскойНастройки = Неопределено Тогда 
		Возврат СписокРегистров;
	КонецЕсли;
	
	Если ТипЗнч(ЭлементПользовательскойНастройки.Значение) = Тип("СписокЗначений")
		И ЭлементПользовательскойНастройки.Значение.Количество() > 0 Тогда 
		Возврат ЭлементПользовательскойНастройки.Значение;
	КонецЕсли;
	
	Если ТипЗнч(ЭлементПользовательскойНастройки.Значение) <> Тип("Строка")
		Или Не ЗначениеЗаполнено(ЭлементПользовательскойНастройки.Значение) Тогда 
		Возврат СписокРегистров;
	КонецЕсли;
	
	СписокВыбранныхРегистров = Новый СписокЗначений;
	СписокВыбранныхРегистров.Добавить(ЭлементПользовательскойНастройки.Значение);
	
	Возврат СписокВыбранныхРегистров;
	
КонецФункции

Процедура УстановитьПараметрыДанных(Настройки, ЗначенияПараметров, ПользовательскиеНастройки = Неопределено)
	
	ПараметрыДанных = Настройки.ПараметрыДанных.Элементы;
	
	Для Каждого ЗначениеПараметра Из ЗначенияПараметров Цикл 
		
		ПараметрДанных = ПараметрыДанных.Найти(ЗначениеПараметра.Ключ);
		
		Если ПараметрДанных = Неопределено Тогда
			ПараметрДанных = ПараметрыДанных.Добавить();
			ПараметрДанных.Параметр = Новый ПараметрКомпоновкиДанных(ЗначениеПараметра.Ключ);
		КонецЕсли;
		
		ПараметрДанных.Использование = Истина;
		ПараметрДанных.Значение = ЗначениеПараметра.Значение;
		
		Если Не ЗначениеЗаполнено(ПараметрДанных.ИдентификаторПользовательскойНастройки)
			Или ТипЗнч(ПользовательскиеНастройки) <> Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда 
			Продолжить;
		КонецЕсли;
		
		СоответствующийПараметр = ПользовательскиеНастройки.Элементы.Найти(
			ПараметрДанных.ИдентификаторПользовательскойНастройки);
		
		Если СоответствующийПараметр <> Неопределено Тогда 
			ЗаполнитьЗначенияСвойств(СоответствующийПараметр, ПараметрДанных, "Использование, Значение");
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Функция ЭтоЧисло(Знач ПроверяемоеЗначение)
	
	Если ПроверяемоеЗначение = "0" Тогда
		Возврат Истина;
	КонецЕсли;
	
	ОписаниеЧисла = Новый ОписаниеТипов("Число");
	
	Возврат ОписаниеЧисла.ПривестиЗначение(ПроверяемоеЗначение) <> 0;
	
КонецФункции

Функция ПараметрыРасположенияЭлементовУправления()
	
	Настройки         = Новый Массив;
	ЭлементУправления = Новый Структура;
	
	ЭлементУправления.Вставить("Поле",                     "СписокРегистров");
	ЭлементУправления.Вставить("РастягиватьПоГоризонтали", Ложь);
	ЭлементУправления.Вставить("АвтоМаксимальнаяШирина",   Истина);
	ЭлементУправления.Вставить("Ширина",                   40);
	
	Настройки.Добавить(ЭлементУправления);
	
	Результат = Новый Структура();
	Результат.Вставить("ПараметрыДанных", Настройки);
	
	Возврат Результат;
	
КонецФункции

Функция УстановитьПараметрВывода(КомпоновщикНастроекГруппировка, ИмяПараметра, Значение)
	
	ПараметрСКД = Новый ПараметрКомпоновкиДанных(ИмяПараметра);
	Если ТипЗнч(КомпоновщикНастроекГруппировка) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда	
		ЗначениеПараметра = КомпоновщикНастроекГруппировка.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(ПараметрСКД);
	Иначе
		ЗначениеПараметра = КомпоновщикНастроекГруппировка.ПараметрыВывода.НайтиЗначениеПараметра(ПараметрСКД);
	КонецЕсли;
	
	Если ЗначениеПараметра <> Неопределено Тогда
		ЗначениеПараметра.Использование = Истина;
		ЗначениеПараметра.Значение = Значение;
	КонецЕсли;
	
	Возврат ЗначениеПараметра;
	
КонецФункции

// Параметры:
//  ЭлементыСтруктуры - КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных
//                    - КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных
//                    - КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных
//  ВыбранныеПоляГруппировок - Массив из ВыбранноеПолеКомпоновкиДанных
//  ЗначениеПоиска - Строка
//
Процедура НайтиГруппыВыбранныхПолей(ЭлементыСтруктуры, ГруппыВыбранныхПолей, ЗначениеПоиска)
	
	Для Каждого Элемент Из ЭлементыСтруктуры Цикл
		Если ТипЗнч(Элемент) = Тип("ГруппировкаКомпоновкиДанных") Тогда
			Если Элемент.Имя = ЗначениеПоиска Тогда
				НайтиГруппыВыбранныхПолейРегистра(Элемент.Структура, ГруппыВыбранныхПолей);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

// Параметры:
//  ЭлементыСтруктуры - КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных
//                    - КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных
//                    - КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных
//  ВыбранныеПоляГруппировок - Массив из ВыбранноеПолеКомпоновкиДанных
//
Процедура НайтиГруппыВыбранныхПолейРегистра(ЭлементыСтруктуры, ГруппыВыбранныхПолей)
	
	Для Каждого ЭлементСтруктуры Из ЭлементыСтруктуры Цикл
		Если ТипЗнч(ЭлементСтруктуры) = Тип("ГруппировкаКомпоновкиДанных") Тогда
			Для Каждого ЭлементВыбора Из ЭлементСтруктуры.Выбор.Элементы Цикл 
				Если ТипЗнч(ЭлементВыбора) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда 
					ГруппыВыбранныхПолей.Добавить(ЭлементВыбора);
				КонецЕсли;
			КонецЦикла;
			
			НайтиГруппыВыбранныхПолейРегистра(ЭлементСтруктуры.Структура, ГруппыВыбранныхПолей);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Функция ПараметрыОтчета(Настройки, ПользовательскиеНастройки)
	
	Результат = Новый Структура("ДокументВладелец");
	
	Если Настройки.ДополнительныеСвойства.Свойство("ИсходныйДокументВладелец", Результат.ДокументВладелец)
		И ЗначениеЗаполнено(Результат.ДокументВладелец) Тогда 
		
		Настройки.ДополнительныеСвойства.Удалить("ИсходныйДокументВладелец");
		Возврат Результат;
		
	КонецЕсли;
	
	НайденныйПараметр = Неопределено;
	
	Если ТипЗнч(ПользовательскиеНастройки) = Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда
		Для Каждого Элемент Из ПользовательскиеНастройки.Элементы Цикл
			Если ТипЗнч(Элемент) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
				ИмяПараметра = Строка(Элемент.Параметр);
				Если ИмяПараметра = "ДокументВладелец" Тогда
					 НайденныйПараметр = Элемент;
					 Прервать;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	Если НайденныйПараметр = Неопределено
		Или Не ЗначениеЗаполнено(НайденныйПараметр.Значение) Тогда
		
		НайденныйПараметр = Настройки.ПараметрыДанных.Элементы.Найти("ДокументВладелец");
	КонецЕсли;
	
	Если НайденныйПараметр <> Неопределено Тогда
		Результат.ДокументВладелец = НайденныйПараметр.Значение;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция СвойстваРегистра(Знач ТекстОбласти)
	
	ТекстОбласти = ВРег(СокрЛП(ТекстОбласти));
	Если Не ЗначениеЗаполнено(ТекстОбласти) Тогда
		Возврат Неопределено;
	КонецЕсли;
		
	ПозицияКоличества = СтрНайти(ТекстОбласти, "(", НаправлениеПоиска.СКонца);
	Если ПозицияКоличества = 0 Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ЗаголовокТаблицы = Лев(ТекстОбласти, ПозицияКоличества - 2);
	
	Возврат СвойстваРегистров.Найти(ЗаголовокТаблицы, "ЗаголовокТаблицы");
	
КонецФункции

Процедура ВосстановитьОтборПоГруппировкамРегистров(Настройки)
	
	СписокРегистров = Новый СписокЗначений;
	
	НайденныйПараметр = Настройки.ПараметрыДанных.Элементы.Найти("СписокРегистров");
	Если НайденныйПараметр <> Неопределено Тогда 
		
		Если ТипЗнч(НайденныйПараметр.Значение) = Тип("СписокЗначений") Тогда 
			СписокРегистров = НайденныйПараметр.Значение;
		ИначеЕсли НайденныйПараметр.Значение <> Неопределено Тогда 
			СписокРегистров.Добавить(НайденныйПараметр.Значение);
		КонецЕсли;
		
	КонецЕсли;
	
	СтруктураОтчета = Настройки.Структура;
	Для Каждого ЭлементСтруктуры Из СтруктураОтчета Цикл
		
		СвойстваРегистра = СвойстваРегистров.Найти(ЭлементСтруктуры.Имя, "ИмяГруппировки");
		Если СвойстваРегистра = Неопределено Тогда 
			ЭлементСтруктуры.Использование = Ложь;
			Продолжить;
		КонецЕсли;
		
		ЭлементСтруктуры.Использование =
			СписокРегистров.НайтиПоЗначению(ЭлементСтруктуры.Имя) <> Неопределено
			И СвойстваРегистра.КоличествоЗаписей > 0;
		
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(
			ЭлементСтруктуры.Отбор,
			"ИмяРегистра",
			ЭлементСтруктуры.Имя,
			ВидСравненияКомпоновкиДанных.Равно,
			НСтр("ru = 'Служебный отбор'"),
			Истина,
			РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный);
		
	КонецЦикла;
	
КонецПроцедуры

Процедура ОпределитьИспользуемыеТаблицы(Форма)
	
	Если ТипЗнч(Форма) <> Тип("ФормаКлиентскогоПриложения") Тогда 
		Возврат;
	КонецЕсли;
	
	ИспользуемыеТаблицы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Форма.НастройкиОтчета, "ИспользуемыеТаблицы");
	Если ИспользуемыеТаблицы <> Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	ИспользуемыеТаблицы = ВариантыОтчетов.ИспользуемыеТаблицыОтчета(ЭтотОбъект);
	Форма.НастройкиОтчета.Вставить("ИспользуемыеТаблицы", ИспользуемыеТаблицы);
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли